bash скрипт по ssh
Пытаюсь написать скрипт, которые бы по ssh выполнял на выбор определенные команды т.е. вводим имя компа, вводим цифру соответствуюшую какой то команде, далее через условия выполняем нужную команду.
Проблема:
пишет что не найден процесс такой то, т.е. поиск процесса и grep по нему происходит не на удаленной машине, а на моей. При этом если команду ps aux | grep 1cv8 |grep "Документы" | awk '{print \$2}' написать за пределами if то она отрабатывает на удаленной машине как положено.
#!/bin/bash
echo "Введите имя компьютера:"
read ip
echo "1-kill Документы, 2-kill Отчёты"
read y
user="root"
pass="12345"
sshpass -p ${pass} ssh ${user}@${ip} << !
if [ $y -eq 1 ]; then
kill -9 $(ps aux | grep 1cv8 |grep "Документы" | awk '{print $2}')
elif [ $y -eq 2 ]; then
kill -9 $(ps aux | grep 1cv8 |grep "Отчеты" | awk '{print $2}')
else
echo "Ввели не правильное значение"
fi
!
Ответы (3 шт):
вы используете heredoc для передачи аргументов программе ssh (ну, точнее, sshpass, которую лучше выкинуть и забыть, освоив аутентификацию по ключу).
внутри heredoc до передачи его программе осуществляется полноценная обработка кода: подстановка значений переменных, подстановка вывода команд (внутри $(...)) и т.п.
чтобы избежать данных подстановок (т.е., передать строки программе «как есть»), можно заэкранировать символ $, добавив перед ним обратный слэш.
в вашем случае это требуется в четырёх местах:
... \$(...) ... \$2 ...
... \$(...) ... \$2 ...
можно было бы полностью отключить какую-либо интерпретацию кода внутри heredoc, заключив «слово-ограничитель» в кавычки:
команда << 'слово'
...
слово
но в этом случае не будет подсталено и значение переменной $y, что нарушит логику работы того, что вы пишете.
1. Авторизация по ключу
Вначале сделайте авторизацию по ключу, то есть без использования пароля.
ssh-copy-id root@ваш-удаленный-сервер-1
ssh-copy-id root@ваш-удаленный-сервер-2
...
Так проще, и не надо хранить пароли в файле. И обновлять эти пароли.
2. Напишите командный скрипт без HEREDOC
В другом ответе предлагают экранировать $. Так не удобно писать код. Сделайте отдельный исполняемый файл, который в аргументах принимает все что нужно.
script.sh:
#!/bin/bash
whoami
echo Первый аргумент команды: $1
Такой скрипт также проще отлаживать сразу в виде файла на удаленном сервере без ввода каждый раз команд. Также используйте set -x для отладки.
3. Напишите скрипт, который копирует и запускает командный скрипт
Скрипт runner.sh создает временный файл на удаленной машине, копирует в него командный скрипт script.sh и запускает, передавая аргументы:
#!/bin/bash
echo "Введите имя компьютера:"
read ip
echo "1-kill Документы, 2-kill Отчёты"
read y
user="root"
# создаем временный файл на удаленной машине
tmp_file=$(ssh -q ${user}@${ip} mktemp)
# копируем файл script.sh на удаленную машину во временный файл
scp -q $(dirname $(readlink -f $0))/script.sh "$user@$ip:$tmp_file"
# выполняем скрипт
ssh -q $user@$ip "/bin/bash $tmp_file '$y'"
Временный файл - каждый раз новый, конфликтов не должно быть. При перезагрузке системы все временные файлы очищаются. При желании, в runner.sh добавьте удаление файла.
А как прикрутить сюда RSA ключик, тк подключение SFTP SSH требует подключение с использованием публичного ключика RSA... Как сделать скрипт копирования файла из локальной папки сервера linux ubuntu в удаленную папку, по ssh sftp, но с использованием ключика? Спасибо!