Введение
Как правило, для входа на удаленные серверы используется ssh-ключ. При необходимости скопировать файлы с одного удаленного сервера на другой в такой ситуации подходят два варианта:
- копировать к себе на локальный компьютер файлы, а с локального уже по месту назначения
- с одного удалённого сервера настраивать доступ ко второму удалённому серверу (пароль или ещё один ключ)
Оба эти варианта имеют право на жизнь, но не всегда применимы, а потому есть более удобный способ с применением ssh-agent. Агент отслеживает идентификационные ключи пользователей и их парольные фразы, для возможности входа на другие серверы без повторного ввода пользователем пароля или ключевой фразы.
Используется такая схема: workstation -> server1 -> server2
Ключ с рабочей станции прокидывается на server1, с которого уже можно подключаться на server2, используя прокинутый ключ.
Запуск ssh-agent
- Если уже имеется ssh-client, сгенерирован ssh-key и настроен доступ к удалённым серверам по этому ключу, то для запуска ssh-agent достаточно выполнить следующую команду:
eval `ssh-agent`
Используется eval, потому что команда ssh-agent
просто выводит переменные окружения, а eval
загружает их в оболочку для последующего использования. Переменные следующие:
SSH_AUTH_SOCK=/tmp/ssh-gbpVsO1oELVC/agent.11713; export SSH_AUTH_SOCK;
SSH_AGENT_PID=11714; export SSH_AGENT_PID;
echo Agent pid 11714;
В $SSH_AUTH_SOCK
хранится путь до сокета, который собственно и пробрасывается на удаленные серверы.
- После запуска необходимо добавить ключи в агент, выполнив команду:
ssh-add
По умолчанию будут добавлены ключи из стандартного пути ~./ssh, при необходимости можно указать явно путь.
- Для проверки, что ключ добавлен, выполнить команду:
ssh-add -l
2048 SHA256:WV4+lDdR32EODDfTodU/+hPVigPyiPQCvGi1qjPpAs /home/it-lux/.ssh/id_rsa (RSA)
Вывод не должен быть пустой. Также можно использовать аргумент ssh-add -L
для вывода ключа целиком.
- Для подключения с возможностью проброса ssh-ключа к удаленному серверу, в конфигурационном файле
~.ssh/config
клиента необходимо указать проброс агента:
Host server1
ForwardAgent yes
- После чего можно выполнять подключение на удаленный сервер:
ssh $USER@server1
- Оказавшись на удаленном сервере, необходимо проверить, что в каталоге /tmp появился сокет, а переменная SSH_AUTH_SOCK не пустая:
echo "$SSH_AUTH_SOCK"
/tmp/ssh-9iu1Y7numW/agent.12163
Если переменная пустая, значит что-то сделано не так:
- агент на клиенте не запущен или наоборот запущено несколько копий
- не добавлен ключ
- в конфиге
~.ssh/config
ошибка
Теперь с удаленного server1 можно подключаться на server2 при условии, что на server2 настроен вход по ключу с рабочей станции:
server1> ssh $USER@server2
Передача файлов через rsync между удалёнными серверами
После настройки ssh-agent и получения возможности подключения к серверам с пробросом ключа может возникнуть необходимость передачи файлов. При использовании rsync ничего нового придумывать не надо:
server1> rsync -av test_dir server2:/home/$USER/test_dir
Но при необходимости передать по аналогии выше через тот же rsync файлы с server1, принадлежащие root или другому пользователю, даже при наличии требуемых sudo привилегий, может возникнуть нюанс.
sudo rsync -av /root server2:/home/$USER
root@server2's password:
Будет запрошен пароль, причём для root, т.к. изменился пользователь и переменные окружения вместе с ним. А потому обходной путь следующий:
sudo -E sh -c 'rsync -av /root $USER@server2:/home/$USER'
sudo -E
сохраняет переменные окружения от текущего пользователя и запускает новую оболочку с ними, а в rysnc для сервера назначения указан пользователь, для которого прокинут ключ, поэтому в таком виде файлы будут успешно переданы без пароля.
При необходимости на удаленном сервере server2 запустить rsync с правами sudo, необходимо добавить флаг:
sudo -E sh -c 'rsync -av --rsync-path 'sudo rsync' /root $USER@server2:/home/$USER'
Заключение
Таким простым и нехитрым способом можно прыгать по серверам и передавать между ними файлы. Важные моменты:
- в .ssh/config указывать звёздочку, т.е. проброс агента для всех серверов, не очень хорошая идея по части безопасности – любой пользователь может воспользоваться прокинутым ключом в своих интересах
- для подключения с server2 на server3, т.е. дальше по цепочке, на server2 должен быть настроен проброс ForwardAgent