sudo bash -c hat die Erlaubnis verweigert

622
st.

In meinem Linux (Centos 7) gibt es 2 Benutzer A (normaler Benutzer) und B (gehört zur Radgruppe). Ich versuche, die .bash_profile-Datei von Benutzer A zu ändern, indem Sie den folgenden Befehl mit Benutzer B ausführen.

./test.sh /home/a/.bash_profile "etwas exportieren"

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

Es gab jedoch den folgenden Fehler:

/home/a/.bash_profile.bak: Berechtigung verweigert

0

1 Antwort auf die Frage

0
Oleg Bolden

Sie brauchen keinen $()Operator in sudo sh -c ...Befehlen.

Wenn Sie diesen Operator für sed '$a\' $ > $.bakdann sedund Umleitung in Datei verwenden, werden die >Befehle zuerst unter den Rechten von Benutzer b ausgeführt, die zum Schreiben nicht ausreichen. Und erst danach sudo sh -cerfolgt die Ausgabe der vorherigen Befehle.

Verwenden Sie sudo sh -c "sed ..."und sudo sh -c "echo ..."stattdessen.

es sagt "sed: -e Ausdruck # 1, Zeichen 1: unterminierte Adresse Regex" st. vor 7 Jahren 0
SED versteht nicht, was Sie tun möchten. Wie ich sehen kann, versuchen Sie am Ende von $ etwas hinzuzufügen, aber Sie fügen nichts hinzu. Oleg Bolden vor 7 Jahren 0
Eigentlich möchte ich, dass ** mit Benutzer B ** ein neues Zeilenende am Ende von A .bash_profile hinzugefügt wird, wenn ** neues Zeilenzeichen nicht vorhanden ist **. Fügen Sie dann am Ende von .bash_profile einen neuen Inhalt hinzu. Sichern Sie dabei die Originaldatei für den Fall. st. vor 7 Jahren 0
Um eine neue Zeile hinzuzufügen, verwenden Sie '\ $ a \' regexp Oleg Bolden vor 7 Jahren 0
Das Dollarzeichen sollte mit einem \ in der Regex oben abgesetzt werden. Wenn Sie nicht entkommen, wird sie von bash als Variable "$ a" betrachtet und versucht, sie durch ihren Wert zu ersetzen. Oleg Bolden vor 7 Jahren 0