Простая, но тем не менее интересная задачка встала передо мной буквально вот сейчас.
Дано:
- машина в облаке с доступом по SSH-ключу без пароля;
- ключ прописан всего один, и от другого ноута.
Задача: дать доступ с рабочего ноута, у которого нет доступа к облачной машине.
Для красноглазого со стажем это не покажется чем-то сложным, а вот для новичка в этих наших линуксах вполне может. А уж для «виндовоза» все закончится еще на слове «SSH» :) Шутка, конечно же, ни в коем случае не хотел оскорбить пользователей винды.
Итак, есть ноут с доступом, его ключ прописан на удаленной машине. То есть доступ к самой удаленной машине есть! Теперь надо просто закинуть туда ключ с другого ноута, воспользовавшись первым.
Для начала перекидываем ключ с одного ноута на другой. Я сделал это с помощью все того же SSH (если для ноута включен доступ, конечно же, часто на десктопных ОС он выключен по умолчанию): $ scp ~/.ssh/id_rsa.pub user@host:/path/to/file
.
При передаче по scp первым параметром идет то, что копируем, а вторым путь, куда мы это копируем. Здесь я копирую локальную публичную часть SSH-ключа на второй ноут. user
здесь — имя пользователя удаленной машины, а host
– айпишник или сетевое имя.
Теперь ключ лежит на ноуте, который имеет доступ к удаленной машине.
Кто не знает, SSH-ключ представляет собой простой текстовый файл с одной строкой, содержащей нужные данные, и посмотреть его можно банальной командой cat
: cat ~/.ssh/id_rsa.pub
.
На удаленном сервере публичная часть ключа должна быть прописана в файле ~/.ssh/authorized_keys
. Там может быть несколько ключей, каждый расположен на новой строке. Поэтому на машине, на которую мы скопировали ключ, выполняем следующую магию (находясь в каталоге, куда мы положили файл со второго ноута): cat ./id_rsa.pub | ssh user@host "cat >> ~/.ssh/authorized_keys"
.
Тут все просто — простой «конвейер» из двух команд: первая вываливает содержимое файла ключа, а вторая переносит это по SSH на удаленную машину (доступ к которой у нас был с этого ноута изначально) и снова вываливает полученное содержимое в stdout, тут же перенаправляя вывод в нужный файл.
Все, можно идти на второй ноут и проверять, что все работает, и доступы появились.
P.S. В принципе, все это можно было бы обернуть вообще в одну длинную команду, где последовательно скинуть ключ на первый ноут, а потом вывалить его содержимое в нужный файл на удаленной машине. И получился бы красивый однострочник, но я решил пойти двумя шагами, чтобы было более понятно, как и что делается.