sudoを使用したリダイレクトまたはパイピングを含むコマンドの実行方法


60

ルートアカウントの代わりにsudoを使用するのがベストプラクティスであると想定しているものに従うようにしています。

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

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

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

例はそれだけですが、ルートアカウントで検証およびテストされています。

回答:


75

ルートとして新しいシェルを呼び出すことができます。

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

8
一般に、2番目のオプションはより安全です。なぜなら、teeコマンドはrootとして実行されるだけで、複雑で誤動作を起こしやすいメインコマンドではないからです。(ではありませんecho
pabouk

19

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

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

ルートアカウントは実際には有効になっていませんが、ルートとして安全に実行できるため、これは依然としてベストプラクティスのルールに従います。から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. 

別の選択肢はsudo bash
-starbeamrainbowlabs

11

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

これをルートとして実行するには:

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 %、開いたファイルにルートとして書き込むために呼び出すか、sudo.vimプラグインを使用します。または、sudoの最後からを呼び出しますsudoedit /etc/conf.d/hwclock

または、暗黒面に屈してシェルをルートとして実行することもできます。

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

5

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

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

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

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

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

bashや、「ここで、文字列を」理解任意のシェル:

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ルートとして実行されている子シェル内でリダイレクトが行われます。


4

sudo dd of=

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

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

または、ファイルを最初から再作成するには:

echo inbytes | sudo dd of=outfile

利点:

  • リダイレクトしteeないためよりも良い/dev/null
  • shサブシェルがないからよりいい
  • ddstatus=progress転送の進行状況を確認するなど、多くの強力なオプションがあります

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.