web-dev-qa-db-ja.com

リダイレクトまたはsudoでのパイプ処理を含むコマンドを実行する方法は?

私は、rootアカウントの代わりにSudoを使用するベストプラクティスであると私が想定していることに従っています。

次のような単純な連結ファイル操作を実行しています。

Sudo echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

これは、通常のユーザーとして実行されている「>>」の右側に関しては失敗します。余分なsudoを追加することも失敗します(ファイルではなくSudoコマンドにパイプするため、予想される動作)。

例はそのとおりですが、rootアカウントで検証およびテストされています。

67
DarkSheep

Rootとして新しいシェルを呼び出すことができます:

Sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

プロセスを昇格してファイルに書き込むこともできます。

Sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF
85
Chris Down

同様に安全な別のオプションは、Sudo-iスイッチを使用してrootとしてログインすることです。

$ Sudo -i
# echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Rootアカウントは実際には有効になっていないため、これは依然としてベストプラクティスルールに従いますが、rootとして安全に実行できます。 man Sudoから:

The -i (simulate initial login) option runs the Shell
    specified by the password database entry of the target user
    as a login Shell.  This means that login-specific resource
    files such as .profile or .login will be read by the Shell.
    If a command is specified, it is passed to the Shell for
    execution via the Shell's -c option.  If no command is
    specified, an interactive Shell is executed. 
20
terdon

コマンドを一重引用符なしで表す場合は、コマンドを一重引用符で囲み、中間シェルを介して実行できます。

これをrootとして実行するには:

echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

'を使用しない別の方法でコマンドを記述します。

echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock

次にSudo sh -c …を呼び出します。

Sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

または、rootだけが書き込めるファイルに出力を書き込むには、Sudo teeを呼び出します。 -aオプションをteeに渡して宛先ファイルに追加します。追加しない場合、ファイルは切り捨てられます。

echo 'clock_hctosys="YES"' | Sudo tee -a /etc/conf.d/hwclock >/dev/null

より複雑なファイルの変更については、Sudo sedSudo edSudo Perl、…を呼び出すことができます。

または、適切なエディタを使用して、Sudoを呼び出すようにします。 Emacsで、/Sudo:/etc/conf.d/hwclockを開きます。 Vimで:w !Sudo tee %を呼び出して、開いているファイルにrootとして書き込むか、 Sudo.vimプラグイン を使用します。または、Sudo側からsudoedit /etc/conf.d/hwclockを呼び出します。

または、ダークサイドに屈して、ルートとしてシェルを実行することもできます。

$ Sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

リダイレクト先のファイルの権限が原因で、コマンドは失敗します。リダイレクトは、Sudoコマンドが呼び出される前でも発生します。

書き込みのために実際にファイルを開くのはルートであることを確認する必要があります。

それを行う最も簡単な方法:

echo 'clock_hctosys="YES"' | Sudo tee -a /etc/conf.d/hwclock >/dev/null

echoは、テキスト文字列を生成するだけなので、通常のユーザーとして実行できます。ただし、teeユーティリティはrootとして実行する必要があり、tee -aはデータを追加します。 teeはデフォルトで、指定されたファイルへの書き込みに加えて、入力データを標準出力に複製するため、出力を/dev/nullにリダイレクトします。

bashまたは「here-strings」を理解する任意のシェル:

Sudo tee -a /etc/conf.d/hwclock >/dev/null <<<'clock_hctosys="YES"'

これは上記と同じです。文字列の生成方法のみが変更されます。


別の、少し回り道をする方法:

Sudo sh -c 'echo clock_hctosys=\"YES\" >>/etc/conf.d/hwclock'

ここでは、ルートとして実行されているsh -c子シェル内でリダイレクトが行われます。

6
Kusalananda

Sudo dd of=

必要に応じて追加するには:

echo inbytes | Sudo dd of=outfile oflag=append conv=notrunc

または、ファイルを最初から再作成します。

echo inbytes | Sudo dd of=outfile

利点:

  • teeより良い/dev/nullリダイレクト
  • サブシェルがないのでshより良い
  • ddには、多くの強力なオプションがあります。 status=progress転送の進行状況を確認する

Sudoがstdinをコマンドに転送するため、機能します。