Мне не удалось найти вопрос, описывающий этот конкретный сценарий.
Я пытаюсь выполнить очень простой сценарий bash для получения журнала с нескольких машин. Я запускаю сценарий локально, но мне нужно получить доступ к внешнему компьютеру через ssh, а также через sudo для привилегированного пользователя один раз на этом компьютере ...
ssh myuser@machine.net
sudo su - privledged_user
cat logs > file.txt
Запуск с помощью sh -x показывает, что bash застревает на строке 'ssh'. Итак, я попытался изменить его так:
ssh myuser@machine.net sudo su - privledged_user cat logs > file.txt
Это также, кажется, остановится на неопределенное время. Есть ли лучшее решение этой проблемы ?? Насколько я могу судить, я не вижу способа обойтись без sudo su ...
Спасибо за любую помощь!
Если вы не хотите или не можете запретить sudo запрашивать пароль, один простой прием: прочтите это на месте и сохраните его в локальной переменной:
read -p 'Password: ' -s password
ssh -t user@1.2.3.4 <<EOF
echo "$password" | sudo -S whoami
EOF
Способ, которым я достигаю этого в моей текущей среде, - запустить ssh с -t
флаг, который принудительно выделяет tty, а затем запускает в нем sudo -u root, как показано ниже:
ssh -t hostname << EOF
command1
sudo -u root command2
sudo -u otheruser "command3 | command4"
sudo -u root /bin/bash -c "command5; command6; command7"
command8 && ( sudo -u otheruser /bin/bash -c "cmd1 ${1}; cmd2 {$2}" ) || echo cmd2 did not work
EOF
У меня есть учетная запись в sudoers на удаленной стороне, поэтому пароль не требуется.
В этом примере показаны различные способы сделать это в рамках одного сеанса ssh, включая выполнение нескольких команд с помощью bash или внутри подоболочки. Также обратите внимание, что если вы поместите приведенный выше код в исполняемый сценарий, вы можете передать аргументы командной строки ($ 1 и $ 2) в ssh, и они будут развернуты, а затем на удаленную сторону будут ссылаться.
Если sudo настроен на разрешение команд без пароля, это должно делать то, что вы хотите:
ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs'" > file.txt
или
ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs > file.txt'"
в зависимости от того, хотите ли вы file.txt
файл может быть создан локально или удаленно.
В противном случае вот способ передать пароль удаленного пользователя sudo
:
echo mrhyner_password | \
ssh mrhyner@test-server.net \
"sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"