Как я могу использовать sudo в функции?

Каждый раз Вам нужна синхронизация между двумя папками rsync большой гибкий выбор. Проблема, что rsync не будет поддерживать протокол ftp. Хорошее обходное решение для этого является curlFtpFS:

CurlFtpFS является файловой системой для доступа к хостам FTP на основе FUSE и libcurl.

С curlFtpFs, довольно легким включать удаленную папку ftp в Вашу файловую систему.

Это - короткий пример, который показывает использование обоих инструментов:

curlftpfs -r -s ftp.foobar.com /foo
rsync -a /foo/ /bar
umount /foo

Прочитайте страницу справочника для получения дополнительной информации.

Если Вы не хотите такого усилия установить curlFtpFS и просто хотеть сохранить некоторые файлы в синхронизации, существует много инструментов ftp, которые предлагают такие синхронизирующие функции:

  • FTPSync.pl - простой сценарий Perl для хранения локального и удаленного каталога в синхронизации
  • weex - неинтерактивный клиент FTP для обновления веб-страниц
  • filezilla - GUI клиент FTP с большим количеством функций
  • ...

3
28.08.2018, 02:00
5 ответов

это - обычно плохая практика для помещения sudo в сценарии. Лучший выбор состоял бы в том, чтобы назвать сценарий с sudo от ~/.bash_logout или везде, где еще Вы хотите использовать его, если Вы должны, или лучше все еще просто сделайте /var/log/test.log мировой перезаписываемый.

8
27.01.2020, 21:07
  • 1
    да! я поместил целый сценарий в новый файл test_logger.sh, сделанный этим executeable, затем выполнил его от ~/.bash_logout как так: sudo ~/.bash_logout. работы большой :) –  mulllhausen 07.03.2011, 08:55

sudo не работает в способе, которым Вы могли бы думать, когда Вы используете перенаправление или передаете операторы по каналу. Потоковое изменение не выполняется с sudo полномочия. Это то, почему

sudo echo foo >> bar

не будет работать, если панель будет только корневой перезаписываемой.

Когда Вы запускаете скрипт под sudo, все в сценарии получает полномочия суперпользователя, таким образом, он работает правильно при том обстоятельстве.

Обходное решение должно сделать это, чтобы удостовериться, что команда записи выполняется под sudo:

sudo echo foo | sudo tee bar > /dev/null

Примите во внимание, однако, что это не добавляет в файл. Это перезаписывает файл.

3
27.01.2020, 21:07
  • 1
    это не работает на меня - я попробовал Вашу вторую команду как так sudo echo hi | sudo tee /var/log/test.log > /dev/null но это просто непрерывно запрашивает sudo пароль. –  mulllhausen 07.03.2011, 08:01
  • 2
    У Вас есть установка sudo для запроса пароль каждый раз, когда это используется? Моя конфигурация позволяет непрерывное использование sudo, пока это успешно использовалось за прошлые 2~3 минуты, таким образом, это только запрашивает sudo перед каналом. –  jamesbtate 10.03.2011, 19:41

поскольку Вы нашли, sudo command >out не работает, потому что 'команда' выполняется sudo, но'>' функция оболочки, не 'управляют'. Так, необходимо нарастить саму оболочку:

sudo sh -c "echo $data >>$logfile"

обратите внимание, что Вы хотите быть действительно, действительно уверены, что находится в $data, делающем это:

~$ export data='good; touch /tmp/reallybad'
~$ echo $data
good; touch /tmp/reallybad
~$ sudo sh -c "echo $data>>/tmp/happy"
good
~$ ls /tmp/happy /tmp/reallybad
/tmp/happy  /tmp/reallybad

следовательно предупреждение simon.

8
27.01.2020, 21:07
  • 1
    , ах благодарит разъяснить возможности [инжекция канала?]. я думаю способ, которым я закончил тем, что делал его (см. комментарий согласно решению simon), безопасно, так как нет никакой возможности ни для кого соединить дополнительные команды в мой ~/.bash_logout файл (если вся система не уже поставлена под угрозу, очевидно) –  mulllhausen 07.03.2011, 08:59

Хорошо, если Вы смотрите на страницу справочника sudo, Вы видите примеры того, как использовать его в сценариях...-c опция позволяет, выполняют команду.

0
27.01.2020, 21:07

Вы sudo используете только команду ls , но не ] регистратор . Bash не знает (и не должен) знать, что делает sudo , поэтому он просто передает две команды по конвейеру. Первый - это sudo , а второй - logger . Неважно, если вы sudo ls , logger этого не сделаете.

Вам следует sudo logger , но он не будет работать, потому что это функция Bash, а не исполняемый файл, который должен выполняться sudo .

ОСТОРОЖНО : ls | sudo logger вызовет / usr / bin / logger , если он установлен в вашей системе. Помните: sudo не знает о функциях Bash.

Я бы посоветовал вам добавить пользователя, вызывающего ваш скрипт, в группу владельца файла, чтобы вы могли писать в него без особого повышения привилегий.

Кроме того, ради эффективности вы открываете и закрываете файл журнала для каждой прочитанной строки. Вы можете сделать это только один раз за весь процесс регистрации:

function logger() {
  while read data
  do
    echo "$data"
  done
  return 0
} >>"$logfile"
1
27.01.2020, 21:07

Теги

Похожие вопросы