web-dev-qa-db-ja.com

sudo cat << EOF>ファイルが機能しない、Sudo suが機能する

Bashのコマンドプロンプトで次のことを試しました。

Sudo cat << EOF > /etc/yum.repos.d/some-name.repo
#Content
#....
#...
EOF

文句を言いました:

-bash: /etc/yum.repos.d/some-name.repo: Permission denied

その後、Sudo suSudoの前のcatを除いてまったく同じことを試みましたが、問題なく動作しました。上記で何が欠けていますか?

42
iamauser

出力リダイレクト(例:>)は、UIDで実行中にcatではなくbashによって実行されます。ルートのUIDで実行するには、Sudoを使用します。

Sudo bash -c 'cat << EOF > /etc/yum.repos.d/some-name.repo
line1
line2
line3
EOF'
67
Yuriy Nazarov

別のオプションはティーです。

cat << EOF | Sudo tee -a /etc/yum.repos.d/some-name.repo
...
EOF
29
Mark

@Yuriy Nazarovの答えのバリエーションとして、パイプ出力のみをSudoで上げる必要があります。パイプでつながれた入力は、高くならないままにすることができます。

Sudo bash -c 'cat > /etc/yum.repos.d/some-name.repo' << EOF
line1
line2
line3
EOF

これは、コマンドの非常に小さな部分を引用して_Sudoに送信する必要があることを意味します。

17
Stephen Quan

他の人が指摘したように、シェルのリダイレクトはcatではなく現在のシェルによって行われます。 Sudoは、リダイレクトを実行するシェルではなく、実行されるプログラムの権限のみを変更します。これに対する私の解決策は、リダイレクトを回避することです。

Sudo dd of=/etc/yum.repos.d/some-name.repo << EOF
11
user2359330

テキスト内で 'を使用している場合は、次を使用できます。

$ Sudo bash -c "cat > /etc/postfix/mysql-virtual_forwardings.cf << EOF
user = mail_admin
password = password
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1
EOF
"

これは、Googleクラウドの仮想サーバーcentos 7.0でテストされています

2
Alp Altunel