/root/test.out
への書き込み権限を持たないシェルによってリダイレクトが実行されるため、コマンドが機能しません .出力のリダイレクトは そうではありません sudo によって実行されます。
複数の解決策があります:
-
sudo でシェルを実行し、
-c
を使用してコマンドを与えます。 オプション:sudo sh -c 'ls -hal /root/ > /root/test.out'
-
コマンドでスクリプトを作成し、そのスクリプトを sudo で実行します:
#!/bin/sh ls -hal /root/ > /root/test.out
sudo ls.sh
を実行 .一時ファイルを作成したくない場合は、Steve Bennett の回答を参照してください。 -
sudo -s
でシェルを起動します 次に、コマンドを実行します:[[email protected]]$ sudo -s [[email protected]]# ls -hal /root/ > /root/test.out [[email protected]]# ^D [[email protected]]$
-
sudo tee
を使用 (-c
を使用するときに多くのエスケープが必要な場合 オプション):sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
/dev/null
へのリダイレクト ティーを止めるために必要です 画面への出力から。 追加する 出力ファイルを上書きする代わりに (>>
)、tee -a
を使用 またはtee --append
(最後のものは GNU coreutils に固有のものです)。
2 番目、3 番目、4 番目のソリューションを提供してくれた Jd、Adam J. Forster、Johnathan に感謝します。
ここの誰かが sudoing tee を提案しました:
sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
これは、アクセス権のないディレクトリにコマンドをリダイレクトするためにも使用できます。これは、tee プログラムが実質的に「ファイルへのエコー」プログラムであり、/dev/null へのリダイレクトにより、画面への出力も停止して、上記の元の不自然な例と同じになるため、機能します。
私が自分で見つけたトリックは
sudo ls -hal /root/ | sudo dd of=/root/test.out