Перейти к содержимому

Судо Баш-С дал разрешение отказано

0

В моем linux (centos 7) есть 2 пользователя A (обычный пользователь) и B (принадлежит к группе wheel). Я пытаюсь изменить файл .bash_profile пользователя A, выполнив следующую команду с пользователем B.

./test.sh /home/a/.bash_profile "экспортировать что-то"

#!/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 

Однако это дало следующую ошибку:

/home/a/.bash_profile.bak: В доступе отказано

588 просмотров
st. спросил 9 лет назад
S 3

1 ответ

0
Принятый ответ

Вам не нужен $()оператор в sudo sh -c ...командах.

При использовании этого оператора для sed '$a\' $ > $.bakthen sedи перенаправления в файл >команды сначала выполняются с правами пользователя b, которых недостаточно для записи. И только после этого sudo sh -cвыполняется вывод предыдущих команд.

Используй sudo sh -c "sed ..."и sudo sh -c "echo ..."вместо.

он говорит: "sed: -e выражение # 1, char 1: регулярное выражение с неопределенным адресом"

st. · 9 лет назад · 0

САС не понимает, что вы хотите сделать. Как я вижу, вы пытаетесь что-то добавить в конец $ , но вы ничего не добавляете.

Oleg Bolden · 9 лет назад · 0

На самом деле я хочу, чтобы ** с пользователем B ** добавили символ новой строки в конец .bash_profile, если ** символ новой строки не существует **. Затем добавьте новый контент в конце .bash_profile. При этом сделайте резервную копию исходного файла на всякий случай.

st. · 9 лет назад · 0

Чтобы добавить новую строку, используйте '\ $ a ' regexp

Oleg Bolden · 9 лет назад · 0

Знак доллара следует экранировать с помощью \ в регулярном выражении выше. Если вы не избежите этого, bash рассматривает его как переменную $ a и пытается заменить его значением.

Oleg Bolden · 9 лет назад · 0
Oleg Bolden ответил 9 лет назад
O 1 417