sudoでコマンドラインを実行する

sudoでコマンドラインを実行する

たとえば、ファイルを作成して1行にテキストを入力したい場合は、演算子を使用して出力をファイルにリダイレクトできます>

echo "something" > /path/foobar

しかし、フォルダへのアクセス権がなく、/path/sudo権限が必要な場合は、sudo権限を持つ一般ユーザーと同じコマンドをどのように実行できますか?

頑張った

sudo echo "something" > /path/foobar

editしかし、sudoは評価しかないのでうまくいきません。
>

sudo suもちろん、以下を使用または使用する前にルートにすることができますtee

echo "something" | sudo tee /path/foobar

しかし、最後の行を次のように置き換えて使用できるソリューションを見つけたいと思います。

sudo !!

sudo最後の行を「リサイクル」して一番前に追加する方法はありますか?

ベストアンサー1

sudoシェルコマンドの前で停止することはできず、コマンドを再評価するためにシェルを呼び出す必要があります(変数拡張、リダイレクト演算子用のファイルを開くなどの操作を実行します)。だからそれは

sudo bash -c !!

!!前のコマンドのテキストや特殊文字などが挿入され、正しく機能しないだけです。コマンドテキストを文字列で検索して引数として渡す必要がありますshfc組み込みこうしてください。

sudo bash -c "$(fc -ln -1)"

または、現在実行中の同じバージョンのbashを呼び出す必要があります。

sudo "$BASH" -c "$(fc -ln -1)"

コマンドは別のシェルプロセスで実行されるため、環境変数(停止してくださいsudo)を継承しますが、シェルの内部変数は継承しません。シェルオプション(たとえばkshglob)などの設定もデフォルトから開始されます。

同じコマンド²はzshとkshで動作しますが、ATT ksh93はこれを要求し、first数字lastを3に渡す必要がありますfc(bash、zsh、およびpdksh / mkshでも機能します)。

sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"

$0実行中のシェルを指定するために使用される実行可能ファイルは、シェルが$ PATHを介して呼び出され、$ PATHが変更されていない場合、または絶対パスを介して呼び出される場合にのみ有効です。

以下は少しクリーンですが、より長いzshの別のアプローチです。

sudo zsh -c $history[$[HISTCMD-1]]

最後の警告sudo:潜在的に危険なコマンドです。使いすぎないでください!

の先頭には余分な空白があり、コマンドの置換は末尾の改行を削除しますが、シェルの構文はそれを気にしません。
²zshやkshにはbashのようなものがないと思います$BASH$0これは絶対パス、またはスラッシュが含まれておらず、コマンド検索パスが変更されていない場合にのみ機能します。
³はATT kshのエイリアスですが、それほど良いです。 fchist

おすすめ記事