Для развертывания кода на сервере я запускаю сценарий, который загружает файл развертывания на сервер, используя мой закрытый ключ. Но после scp мне нужно вручную ssh на машину sudo для учетной записи суперпользователя и запустить сценарий развертывания.
Я бы хотел автоматизировать и второй шаг, но не могу понять, как это сделать.
Есть ли другие альтернативы этому двухэтапному процессу?
Если кто-либо контролирует файл sudoers, изменит его, чтобы вы могли запускать определенные команды без пароля, это будет так же просто, как запустить:
$ ssh other-host sudo /path/to/deployment.script
Если нет, тогда вы можете заставить sudo принимать входные данные из файла:
$ ssh other-host 'sudo -S /path/to/deployment.script < password.file'
Но не делайте этого, поскольку это означает, что вы помещаете свой пароль в файл. И администратор сервера должен надрать вам задницу за это.
Лучшим вариантом, чем все вышеперечисленное, является создание администратором сервера записи в файле authorized_keys root, которая может запускать только сценарий развертывания. Таким образом, для запуска скрипта вам нужно только ssh на сервер как root со специальным ключом.
Создайте пару ключей на удаленном хосте только для этой цели и добавьте ее в файл авторизованных ключей root на сервере, на котором вы развертываете. Перед ключом добавьте 'command = "cat - >> file.name; deploy_script.sh", no-port-forwarding, no-X11-forwarding, no-agent-forwarding, no-pty' На удаленном хосте запустить "кошка / путь / к / файлу | ssh -i / путь / к / ключу"
Вы также можете настроить это с помощью scp, используя следующее в файле авторизованных ключей
Команда = "УПП -t /destination/directory/;deploy_script.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty SSH-ДСС xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx пользователь @ remote_server
Если вы не можете получить доступ к файлу authorized_keys2 root, объедините его с паролем без sudo. Если это не разрешено, используйте ssh, scp и expect.
Вы можете сделать это довольно легко с помощью какого-нибудь решения на основе cron
#!/bin/bash
if [ -f /path/to/deployment.script ]; then
mv /path/to/deployment.script /path/to/somewhere/else
do_deployment
fi
Запуск подобного скрипта каждые несколько минут из cron с правами root должен делать то, что вам нужно. Возможно, есть более элегантный способ сделать это, но это самый простой / самый быстрый способ, который пришел в голову.
Я думаю, что ваше лучшее решение - обсудить этот вопрос с тем, кто действительно контролирует сервер. Все решения потенциально нарушают какую-то политику безопасности или требуют изменений, на внесение которых вы не можете быть авторизованы. По сути, похоже, что политика заключается в том, что для запуска чего-либо от имени пользователя root вам нужно каждый раз вводить пароль.
Однако вот локальная функция оболочки, которая может работать:
deploy_bypassing_security () {
if [ -z "$REMOTEPASSWORD" ]; then
read -s -p "Password: " REMOTEPASSWORD
fi
scp deployment_file username@remotehost
echo $REMOTEPASSWORD | ssh -t username@remotehost sudo -S deployment_script
}
Это попросит вас ввести пароль, если у него его нет (так что вы должны получить его правильно с первого раза!), А затем отобразите этот пароль в sudo, указав sudo прочитать пароль из stdin, а не через tty.
Тогда просто беги deploy_bypassing_security
в интерфейсе командной строки. При первом запуске он запрашивает пароль, прежде чем делать что-либо еще, а в следующий раз он просто запускается без запроса. Возможно, вам потребуется добавить "ssh username@remotehost sudo -k
"после scp.
Я бы предложил использовать что-то вроде Chef или Puppet, чтобы справиться с этим, поскольку они, вероятно, будут более безопасными, чем методы, которые вы используете.
Вы можете сделать что-то вроде следующего, чтобы скопировать файл, а затем запускать команды после копирования файла, все в одной команде ssh:
cat testfile | ssh root@superServer 'dd of=/home/testcopy; chown root/home/testcopy; chmod o+rx /home/testcopy; sudo /home/testcopy'
Я действительно думаю, что для этого вам может понадобиться sudo без пароля ... не уверен.