sudoを使用してコマンドラインとエイリアスから前のコマンドを実行する方法(エイリアスを使用)

sudoを使用してコマンドラインとエイリアスから前のコマンドを実行する方法(エイリアスを使用)

(注:これいいえ質問が重複しています。 )

コマンドラインでsudo !!sudoを使用して前のコマンドを実行できます。しかし、前のコマンドでエイリアスを使用するとどうなりますか?

同様に、エイリアスを使用してsudoを介して前のコマンドを実行するには、.bashrcファイルで次の(または他の)オプションのいずれかを使用できます。

alias please='sudo "$BASH" -c "$(history -p !!)"'
alias please='sudo $(fc -ln -1)'
alias please='eval "sudo $(fc -ln -1)"'
alias please='function _please(){ eval "sudo $(fc -ln -1)"; }; _please'
alias please='sudo sh -c '"'"'sudo sh -c $(fc -ln -1)'"'"''
alias please="sudo sh -c 'sudo sh -c $(fc -ln -1)'"

alias temp='sudo -s eval $(fc -ln -1)'

please () (
    my_source=~
    past_command=$(fc -ln -1)
    sd ${past_command}
)

私は前のコマンドのエイリアスを使用して動作するように努力しながら、これらのそれぞれを試しました。私はそれらを拡張するために試してみましたが、shopt -s expand_aliasesこのトリックを試してみましたalias sd='sudo '。それらはすべて通常のコマンドではうまく機能しますが、sudoは私のエイリアスが何であるかを知りません。

私のホームディレクトリにすべてのカスタマイズオプションを維持する必要があります。

sudo sh -c . . .また、可能であれば、パイプやリダイレクトなどのオプションを使用してsudo権限も取得することをお勧めします。

編集:このトリックを使用すると、コマンドラインでは機能しますalias sd='sudo 'が、それでもエイリアスでは機能しないことがわかりました。sd !!

答え1

sudo(で始まるシェル)の内部にはエイリアスは定義されていません。

実際には、起動時に環境変数を削除してエイリアス定義を避けるのが一般的なセキュリティ慣行ですsudo

たとえば、説明します。

実行可能ファイルを作成し/bin(ルートのみを作成できます)、それをユーザーの実行可能ファイルとして定義しましょう。

# echo $'/bin/sh\necho "running $0 by $USER with $EUID"' >/bin/usercmd
# chmod a+x /bin/usercmd

この新しいコマンドは、ユーザーまたはusercmdルートによって簡単に実行できます。sudo usercmd

$ usercmd
running usercmd as isaac with 1027

$ sudo usercmd
running usercmd as root with 0

ユーザーとルートの両方で実行可能ファイルを実行できます。

それでは、非常に単純なエイリアスを定義して試してみましょう。

$ alias tcmd='usercmd'
$ tcmd
$ tcmd
running /usr/bin/usercmd as isaac with 1027

$ sudo tcmd
sudo: tcmd: command not found

sudoには使用できるエイリアスはありません。

唯一の(一般的な)解決策は、エイリアスからコマンドを抽出することです。

$ sudo sudo $(alias tcmd | sed 's/[^=]*=//;s/'\''//g')
running /usr/bin/usercmd as root with 0

関連情報