В ssh-copy-id
был очень полезен для отправки открытых ключей на сервер. Но сейчас он не работает, если у вас нет файла с закрытым ключом.
$ ssh-copy-id -i my_friend_rsa.pub root@example.com
/usr/bin/ssh-copy-id: ERROR: failed to open ID file 'my_friend_rsa': No such file
Я не понимаю этого поведения.
Для меня есть два случая:
Первый случай - редкость. На сервере уже есть мой открытый ключ, если я могу к нему подключиться. Так что мне не нужен ssh-copy-id
в таком случае.
Второй случай встречается очень часто. Предоставляю доступ другому пользователю. Но у меня нет ни его, ни ее закрытого ключа. Таким образом, такое поведение делает ssh-copy-id бесполезным во втором случае.
Пожалуйста, объясни мне почему ssh-copy-id
требуется файл закрытого ключа?
Из-за того, как работает эта программа. Цитируя man ssh-copy-id
:
ssh-copy-id - это сценарий, который использует ssh (1) для входа на удаленный компьютер (предположительно, с использованием пароля для входа, поэтому аутентификация по паролю должна быть включена, если вы не умело использовали несколько идентификаторов). Он собирает список из одного или нескольких отпечатков пальцев (как описано ниже) и пытается войти в систему с каждым ключом, чтобы увидеть, установлены ли уже какие-либо из них (конечно, если вы не используете ssh-agent (1), это может привести к тому, что вам будут постоянно предлагаться парольные фразы). Затем он собирает список тех, кому не удалось войти в систему, и, используя ssh, разрешает вход с этими ключами на удаленном сервере.
Я согласен, что иногда это может быть слишком умно, но здесь не место спрашивать «почему», поскольку мы не разработчики.
Закрытый ключ необходим для проверки правильности установки открытого ключа (в основном это проверка работоспособности). Но ...
Вы можете использовать -f
переключатель, который позволит вам скопировать только открытый ключ на сервер и не будет проверять это (если у вас установлен достаточно новый openssh).
Вот как ssh-copy-id
раньше работал. Другая возможность - это переменная среды SSH_COPY_ID_LEGACY
что позволяет восстановить это поведение:
$ SSH_COPY_ID_LEGACY=1 ssh-copy-id -i my_friend_rsa.pub root@example.com
Или вы можете просто выбрать текущую версию ssh-copy-id
использовать из исходный репозиторий, который поддерживает -f
переключатель.
Как пользователь Windows, я могу сказать, что жаль, что у нас нет ssh-copy-id
сценарий. Но если вы потратите некоторое время на изучение его внутреннего устройства, вы можете узнать, что его можно легко заменить следующей командой:
grep ^AuthorizedKeysFile /etc/ssh/sshd_config | awk '{print $2}' | xargs -I{} sh -c 'ssh-add -L >> {}; sort -u {} -o {}';echo "ForwardAgent yes" >~/.ssh/config
Просто введите эту команду сразу после входа в систему, и в следующий раз вы сможете авторизоваться с помощью своего ключа, и это просто. Если по каким-то причинам это не сработает, опишите, пожалуйста, свою систему в комментариях. Помните, что ваш ssh-клиент должен быть настроен на использование агента, пересылки и пароля, чтобы эта команда работала. Вот это экран настроек шпатлевки.
P.S. Если вам интересно, он тоже работает linux -> linux ...