私は、rootアカウントの代わりにSudoを使用するベストプラクティスであると私が想定していることに従っています。
次のような単純な連結ファイル操作を実行しています。
Sudo echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock
これは、通常のユーザーとして実行されている「>>」の右側に関しては失敗します。余分なsudoを追加することも失敗します(ファイルではなくSudoコマンドにパイプするため、予想される動作)。
例はそのとおりですが、rootアカウントで検証およびテストされています。
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
同様に安全な別のオプションは、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.
コマンドを一重引用符なしで表す場合は、コマンドを一重引用符で囲み、中間シェルを介して実行できます。
これを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 sed
、Sudo ed
、Sudo 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
子シェル内でリダイレクトが行われます。
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をコマンドに転送するため、機能します。