1つのsudoでコマンド行を実行する

1つのsudoでコマンド行を実行する

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

echo "something" > /path/foobar

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

私は試した

sudo echo "something" > /path/foobar

しかし、これは機能しません。なぜなら、sudoは のみを対象とし、 のedit右側の部分は対象としないからです。
>

sudo suもちろん、代わりに以下を使用してroot になることもできますtee:

echo "something" | sudo tee /path/foobar

しかし、私は最後の行を置き換えとして扱うことができる解決策を見つけたいと思っています。

sudo !!

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

答え1

シェルコマンドの前に単に貼り付けることはできませんsudo。シェルを呼び出してそのコマンドを再度評価する必要があります(変数の展開、リダイレクト演算子のファイルのオープンなど)。つまり、

sudo bash -c !!

ただし、これはうまく機能しません。なぜなら、!!は前のコマンドのテキスト、特殊文字などをすべて補間するからです。コマンドのテキストを文字列として取得し、それを引数として渡す必要がありますsh。幸いなことに、bashのfc組み込みそれが可能になります¹。

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

あるいは、現在実行中の bash と同じバージョンを確実に呼び出すには、次のようにします。

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

コマンドは別のシェル プロセスで実行されるため、環境変数 (sudo保存されるもののみ) は継承されますが、シェルの内部変数は継承されないことに注意してください。シェル オプション (例kshglob) やその他の設定もデフォルトから開始されます。

同じコマンド² は zsh と ksh でも機能しますが、ATT ksh93 ではfirstlast数値の両方を ³ に渡す必要があります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 でのもう 1 つの方法です。これは少し明確ですが、長くなります。

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

最後に警告しておきますが、sudoは潜在的に危険なコマンドです。 使いやすくしすぎないようにしてください。

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

答え2

同じコマンドを再度実行したい場合はすどう!!次のようなコマンドを実行した後:

echo "something">/path/file

グローバル置換構文を使用してコマンドを呼び出します。

!!:gs/>/|sudo tee -a /

の後にスペースを入れてください-あパラメータ。

これは次のものと同等であるすどう!!ただし、< および > の sudo 制限を回避するのに役立ちます。sudo では [<, >] の使用が許可されていないためです。


リダイレクトの一般的な sudo 制限を回避するには、次のように使用します。

echo "something" | sudo tee myfile

teeコマンドを使用すると、標準入力から読み取り、標準出力とファイルに書き込むことができます。

コマンドを繰り返してファイルにテキストを追加したい場合は、teeコマンドに-あ追加オプション。コマンドを呼び出すには

sudo !!

テキストはファイルに追加されます

例:

echo "something" | sudo tee -a /path/file
sudo !!

答え3

それは次のように単純なようですsudo sh -c "!!":

$ cd /
$ echo hello > foo
bash: foo: Permission denied
$ sudo sh -c "!!"
sudo sh -c "echo hello > foo"
$ ls -l foo
-rw-r--r-- 1 root root 6 Jun 20 16:21 foo

関連情報