Каждый раз Вам нужна синхронизация между двумя папками 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, которые предлагают такие синхронизирующие функции:
это - обычно плохая практика для помещения sudo
в сценарии. Лучший выбор состоял бы в том, чтобы назвать сценарий с sudo
от ~/.bash_logout
или везде, где еще Вы хотите использовать его, если Вы должны, или лучше все еще просто сделайте /var/log/test.log
мировой перезаписываемый.
sudo
не работает в способе, которым Вы могли бы думать, когда Вы используете перенаправление или передаете операторы по каналу. Потоковое изменение не выполняется с sudo
полномочия. Это то, почему
sudo echo foo >> bar
не будет работать, если панель будет только корневой перезаписываемой.
Когда Вы запускаете скрипт под sudo
, все в сценарии получает полномочия суперпользователя, таким образом, он работает правильно при том обстоятельстве.
Обходное решение должно сделать это, чтобы удостовериться, что команда записи выполняется под sudo
:
sudo echo foo | sudo tee bar > /dev/null
Примите во внимание, однако, что это не добавляет в файл. Это перезаписывает файл.
sudo echo hi | sudo tee /var/log/test.log > /dev/null
но это просто непрерывно запрашивает sudo пароль.
– mulllhausen
07.03.2011, 08:01
поскольку Вы нашли, 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.
Хорошо, если Вы смотрите на страницу справочника sudo, Вы видите примеры того, как использовать его в сценариях...-c опция позволяет, выполняют команду.
Вы 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"
test_logger.sh
, сделанный этим executeable, затем выполнил его от~/.bash_logout
как так:sudo ~/.bash_logout
. работы большой :) – mulllhausen 07.03.2011, 08:55