GNU/Linux >> Linux の 問題 >  >> Linux

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を追加する方法はありませんか 前に?

承認された回答:

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

sudo bash -c !!

!!であるため、これは完全には機能しません。 前のコマンドのテキスト、特殊文字、およびすべてを補間します。コマンドのテキストを文字列として取得し、それを引数としてshに渡す必要があります 。幸い、bashのfc ビルトインでそれができます¹。

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

または、現在実行されているのと同じバージョンのbashを必ず呼び出すようにします。

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

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

同じコマンド²がzshとkshで機能しますが、ATTksh93ではfirst およびlast 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 潜在的に危険なコマンド用です。使いやすくしすぎないでください!

関連:sedは改行文字を置き換えることができますか?

¹最初に余分な空白があり、コマンド置換によって最後の改行が削除されますが、シェルの構文はそれを考慮していません。
²zshやkshにはbashの$BASHのようなものはないと思います; $0 絶対パスである場合、またはスラッシュが含まれておらず、コマンド検索パスが変更されていない場合にのみ機能します。
³fc histのエイリアスです ATT kshでですが、それは同じくらい良いです。


Linux
  1. sudo を使用して別のユーザーとして bash サブシェルで一連のコマンドを実行するにはどうすればよいですか?

  2. grep を使用して 1 行に 2 つの文字列を一致させる

  3. docker exec で 2 つのコマンドを実行する

  1. ブレース展開:1 行で展開する代わりに複数のコマンドを実行しますか?

  2. LibreOffice、lprコマンドを使用してコマンドラインから印刷しますか?

  3. 行番号によって、あるファイルの行を別のファイルの行に置き換えます

  1. 複数の Linux コマンドを 1 行にまとめて実行する

  2. Javaでsudo権限でbashコマンドを実行するには?

  3. sudo権限で現在のシェルでシェルスクリプトを実行する