Нужно ли мне делать новую установку каждые 6/9 месяцев? Обновление вызывает проблемы

Вот измененная версия ответа Вилли Уилера, которая передает файл (ы) через tar, но также поддерживает передачу пароля sudo на удаленном хосте.

(stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) \
  | ssh remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""

Немного лишней магии здесь это опция -S для sudo. На странице sudo man:

-S, --stdin Введите запрос стандартной ошибки и прочитайте пароль со стандартного ввода вместо использования терминального устройства. За паролем должен следовать символ новой строки.

Теперь мы действительно хотим, чтобы выход tar включался в ssh и перенаправлял stdin ssh в stdout tar, удаляя любой способ передать пароль в sudo из интерактивного терминала. (Мы можем использовать функцию ASKPASS от sudo на удаленном конце, но это еще одна история.) Мы можем получить пароль в sudo, хотя, предварительно захватив его и добавив его в выход tar, выполнив эти операции в подоболочке и выполнив вывод подоболочка в ssh. Это также имеет дополнительное преимущество, не оставляя переменную среды, содержащую наш пароль, свисающий в нашей интерактивной оболочке.

Вы заметите, что я не выполнил 'read' с параметром -p для печати приглашения. Это связано с тем, что запрос пароля от sudo удобно передавать обратно в stderr нашей интерактивной оболочки через ssh. Вы можете задаться вопросом: «Как выполняется sudo, поскольку он работает внутри ssh справа от нашей трубы?» Когда мы выполняем несколько команд и обрабатываем вывод одного в другое, родительская оболочка (в этом случае интерактивная оболочка) выполняет каждую команду в последовательности сразу после выполнения предыдущего. Поскольку каждая команда за трубой выполняется, родительская оболочка присоединяет (перенаправляет) stdout левой стороны к stdin правой части. Выход затем становится входным, когда он проходит через процессы. Мы можем увидеть это в действии, выполнив всю команду и опираясь на группу процессов (Ctrl-z), прежде чем вводить наш пароль, а затем просматриваем дерево процессов.

$ (stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) | ssh 
remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
[sudo] password for bruce: 
[1]+  Stopped                 ( stty -echo; read passwd; stty echo; echo 
$passwd; tar -cz foo.* ) | ssh remote_host "sudo -S bash -c \"tar -C 
/var/www/ -xz; echo\""

$ pstree -lap $$
bash,7168
  ├─bash,7969
  ├─pstree,7972 -lap 7168
  └─ssh,7970 remote_host sudo -S bash -c "tar -C /var/www/ -xz; echo"`

Наша интерактивная оболочка - PID 7168, наша подоболочка - PID 7969, а наш процесс ssh - PID 7970.

Единственный недостаток заключается в том, что чтение будет принимать входные данные до того, как sudo успеет отправить обратно приглашение. При быстром подключении и быстром удалённом хосте вы не заметите этого, но можете, если он медленный. Любая задержка не повлияет на возможность ввода подсказки; это может появиться после того, как вы начали печатать.

Примечание. Я просто добавил запись файла хоста для «remote_Host» на свой локальный компьютер для демонстрации.

1
задан 27 November 2013 в 23:38

1 ответ

Рекомендую вам взглянуть на это: https://help.ubuntu.com/12.04/serverguide/installing-upgrading.html

0
ответ дан 24 May 2018 в 14:48
  • 1
    Я посмотрел на это, но кажется, что слишком много «магии». происходит под капотом. Я просто создаю резервную копию существующей системы, обновляю ее, а затем даю ей шанс? Я не вижу, как это будет предотвращать проблемы конфигурации, с которыми я сталкивался ранее. – Mark 27 November 2013 в 23:51

Другие вопросы по тегам:

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