sudo bash -cが許可を拒否しました


0

私のlinux(centos 7)には、2人のユーザーA(一般ユーザー)とB(ホイールグループに所属)がいます。 ユーザーBで次のコマンドを実行して、ユーザーAの.bash_profileファイルを変更しようとしています。

./test.sh /home/a/.bash_profile "何かエクスポート"

#!/bin/bash

set -o errexit

filePath=${1};
content=${2};

result=`sudo grep "$content" $filePath || true`\
if [[ -z $result ]] || [[ $result == \#* ]]; then
    echo "inside the first if";
    sudo sh -c "$(sed '$a\' ${filePath} > ${filePath}.bak)";
    sudo sh -c "$(echo $content >> ${filePath}.bak)";
    sudo rm -fr ${filePath};
    sudo mv ${filePath}.bak ${filePath};
fi

ただし、次のようなエラーが発生しました。

/home/a/.bash_profile.bak:権限が拒否されました

回答:


0

いらない $() 演算子in sudo sh -c ... コマンド。

この演算子を sed '$a\' ${filePath} > ${filePath}.bak それから sed とファイルへのリダイレクト > コマンドは最初にユーザーの下で実行されます b これは書き込みには不十分です。そしてその後だけ sudo sh -c 前のコマンドの出力時に実行されます。

つかいます sudo sh -c "sed ..."、そして sudo sh -c "echo ..." 代わりに。


「sed:-e expression#1、char 1:終端されていないアドレスの正規表現」と表示されます。
st.

SEDはあなたがやりたいことを理解していません。ご覧のとおり、あなたは$ {filePath}の最後に何かを追加しようとしていますが、何も追加していません。
Oleg Bolden

実際に私がやりたいことはそれです ユーザーBと 次の場合、Aの.bash_profileの末尾に改行を追加します。 改行文字が存在しません 。次に、Aの.bash_profileの最後に新しいコンテンツを追加します。これをしている間元のファイルを念のためにバックアップします。
st.

改行を追加するには、 '\ $ a \'正規表現を使用してください。
Oleg Bolden

ドル記号は上記の正規表現で\でエスケープする必要があります。あなたがそれをエスケープしないならば、bashはそれを変数とみなします $a そしてそれをその値で置き換えようとします。
Oleg Bolden
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.