コマンドにsudo suを使用していますか?


15

昨夜、コマンドラインスキルの開発に取り組んでいたときに、sudoを使用すると、「permission denied」というエラーメッセージが表示される問題に遭遇しました。ただし、「sudo su」を使用してrootになると、コマンドは機能しました。

最初のインスタンスでsudoが機能しなかったのはなぜですか?

そうだった:

$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D

LAMPサーバーのセットアップに関するセクションのLinux Bible 2010エディションから。


例を挙げないと、問題を解決するのが少し難しくなります。
ラッセポールセン

1
検討sudo -sしてくださいsudo su
ジェレミーL

回答:


18

<、>、および>>は、コマンドの入力/出力のリダイレクトに使用されます。これは、シェル(bashなど)によって提供される機能です。したがって、コマンドsudo cat > /var/www/info.phpを入力すると、これを入力として受け取るシェルはファイルを開こう/var/www/info.phpとし、そのファイルをsudoコマンドへの標準出力として提供します。sudoコマンドは、出力がコンソールに送られるのか、ファイルにリダイレクトされるのかを認識しません。これは、コマンドを呼び出すシェルによって処理されるためです。

コマンドを入力したシェルがログインシェルまたはユーザーIDを持つ端末で実行されている別のシェルである場合、ルートの特権ではなく、ユーザーIDと同じ特権があります。

そのため、あなたの場合、catコマンドはrootとして実行されますが、その出力のコピーは/var/www/info.php通常のユーザーとして実行されているシェルによって試行されますが、予想通り失敗します。

このような状況の回避策は、tee次のコマンドを使用することです:

sudo tee /var/www/info.php

これにより、コンソールに入力されたすべてのテキストを^ Dまで入力して、パラメーターとして指定されたファイルに入れるという効果が得られます。

おそらく望ましくない副作用の1つはtee、出力をstdoutにエコーすることです。そのため、各行を入力してEnterキーを押すteeと、そのコピーが出力されます。これを回避するには、次のバリアントを使用できます。

sudo tee /var/www/info.php > /dev/null

詳細についてteeinfo tee、ターミナルで入手できます。


2

sudoは、次のようなファイルへの書き込み権限が必要なコマンドでは機能しません。

sudo echo "vm.swappines = 100" >> /etc/sysctl.conf

sudo manページで説明しています。


4
「sudo -i」または「sudo -s」を使用してルートプロンプトを取得できると述べれば、この答えはさらに良くなります。
ホルヘカストロ

サンプルコマンドにはパイプはありません。リダイレクトがあります。また、「動作しない場合がある」は、によって不安定な動作を伝えているようsudoです。koushikの回答で述べたように、unix許可モデルでは、動作は非常に予測可能で、一貫性があり、「正しい」ものです。
msw

2

問題は、 "> foo.txt"部分が、sudoコマンドが実行されるずっと前にコマンドインタープリター(シェル)によって解釈および実行されることです。sudoコマンドは、その出力をファイルにリダイレクトすることを知りません。

コマンドインタープリターにはルート権限がありません(ただし、sudoコマンドは最終的には後で実行されます)ので、出力をfoo.txtにリダイレクトできません。


1

これを解決する別の方法は、sudoでサブシェルを開始し、そのサブシェルでそのコマンドを実行することです。

$ sudo bash -c "cat > /var/www/info.php"
<?php
phpinfo( ) ;
? >
^D

ここでは、「sudoを持っている」コマンドはbashであり、その中で実行されるものはすべてroot権限を持っています。

$ 2c、*-パイク

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