Есть ли эквивалент для ssh-copy-id для Windows?


56

Есть ли какой-либо эквивалент или порт ssh-copy-id для Windows? То есть существует ли простой способ переноса ключей SSH с локального компьютера на удаленный сервер под Windows?

На случай, если это поможет, я уже использую Pageant и Kitty (альтернативу Putty).

Ответы:


27

ssh-copy-id - это довольно простой скрипт, который должно быть довольно легко реплицироваться под окнами.

Если вы игнорируете всю обработку параметров, обработку ошибок и т. Д., Это две команды из ssh-copy-id, которые фактически выполняют работу большую часть времени.

GET_ID="cat ${ID_FILE}"
{ eval "$GET_ID" ; } | ssh ${1%:} "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys" || exit 1

При использовании инструментов замазки подобная команда должна быть эквивалентной (не проверенной).

type  public_id | plink.exe username@hostname "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys"

Если вы хотите выполнять одинаковую обработку ошибок и автоматическое расположение ключей, я уверен, что написание скрипта под Windows будет намного сложнее, но, безусловно, возможно.


1
Спасибо! Сначала я не мог заставить его работать; Я получал сообщения об отказе в доступе, но plink не останавливался, чтобы позволить мне ввести пароль. Затем я попытался передать пароль, используя ключ -pw, и это сработало. Знаете ли вы, есть ли способ заставить plink сделать паузу, чтобы вы могли ввести пароль на полпути?
Мэтт В.

Не совсем уверен насчет пароля и аутентификации. Всякий раз, когда я на самом деле использую его, у меня уже есть ключ в системе, и у меня запущен пагент.
Зоредаче

4
plink.exe -pw passwordработает. Кроме того, если вы знаете .ssh / authorized_keys существует команда простоtype id_rsa.pub | plink.exe -ssh user@host -pw password "cat >> .ssh/authorized_keys"
KCD

@ KCD Достаточно, если .ssh/каталог существует. >>Перенаправление будет затем создать файл , если он не существует.
Пабук

20

Эти ответы не помогли мне. Мне действительно не нужны были какие-то сумасшедшие сценарии. Я создал открытый ключ на своем клиентском компьютере в git bash и пытался скопировать его на VPS.

После создания вашего открытого ключа ключ должен быть сохранен как «(в какой бы папке вы не начали) /. Ssh / id_rsa.pub»

Так что используйте эту команду:
cat ~/.ssh/id_rsa.pub | ssh user@123.45.67.89 "cat >> ~/.ssh/authorized_keys" где userваше имя пользователя (иногда «root» или что-то еще, что вы, возможно, настроили), и замените 123.45.67.89его IP-адресом вашего компьютера / хоста / VPS.

Если каталог .sshеще не создан на хост-компьютере, используйте этот небольшой вариант:
cat ~/.ssh/id_rsa.pub | ssh user@123.45.56.78 "mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys"


2
Жаль, что у меня не было больше голосов! 👍 для одного лайнера!
patricktokeeffe

16

ssh-copy-id делает несколько вещей ( подробнее см. справочную страницу ), но самое важное, что он делает, - добавляет содержимое вашего локального файла открытого ключа в удаленный файл с именем author_keys.

  • Вы можете сделать это самостоятельно, открыв файл ключа в текстовом редакторе и вставив содержимое в терминал Kitty.
    echo 'long_line_with_contents_of_public_key_file' >> .ssh/authorized_keys

  • В качестве альтернативы вы можете загрузить файл с помощью WinSCP (который использует sftp или scp в качестве запасного варианта) и сделать что-то похожее на мое предыдущее предложение, без уродливого копирования / вставки.
    cat id_rsa.pub >> .ssh/authorized_keys
    где id_rsa.pub - это имя загруженного вами открытого ключа.


5

Вдохновленный ответом zoredache, я создал несколько сценариев для Windows. Однако все они зависят от мнений. Пожалуйста, посмотрите здесь

https://github.com/VijayS1/Scripts/blob/master/ssh-copy-id/

У меня также есть скрипт winscp, который можно использовать согласно другому ответу. :) Выдержка из файла readme:

Попытка методов до сих пор:

  • DOS (.cmd) - успех
    • usage: .\Scriptname test@example.com password [identity file]
  • VBS (.vbs) - успех
    • usage: .\Scriptname /i:idtest.pub user@example.com /p:password
  • Powershell (.ps1) - успех
    • usage: .\Scriptname -i idtest.pub user@example.com password
  • mremoteNG (внешнее приложение) - Успех
    • Выберите Host, щелкните правой кнопкой мыши, внешние инструменты, выберите Scriptname
  • Скрипт WinSCP (.bat) - успех
    • # "WinSCP.com" /script=".\Scriptname" /parameter "user[:password]@example.com" "id_rsa.pub" [/log=".\copyssh.log]"

1
Это довольно мило
Пред

5

В Windows 7 есть ssh.exe

Вот что сработало для меня:

1. создать личность (на окнах)

c:\>ssh-keygen

Это создало файл идентификации в домашнем каталоге. Я изменил имя открытого ключа на "id_rsa"

2. скопируйте файл в целевую систему linux, используя ssh Credits для https://serverfault.com/users/984/zoredache для его ответа

c:\>ssh user@lnxhost "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1" < \\path_to_where_the_file_was_generated_from_ssh_key_gen\id_rsa.pub

Примечание: по какой-то причине у меня не работает трубопровод:

# this should work but it didn't work for me 
type file | ssh user@lnxhost "cat >> /tmp/t.txt"

3. Исправьте файл в linux Файл id_rsa.pub в windows является многострочным, в котором linux ожидает его в одной строке, поэтому мы должны немного его исправить. Войдите в Linux и откройте файл:

vi ~/.ssh/authorized_keys

Например:

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "2048-bit RSA, user@winhost"
AAAAB3NzaC1yc2EAAAABIwAAAQEAnvYlVooXGoj3+7huZBUqf4wj57r25SHCKiiShyla33
5flX7Rsmb4meExpdh2NzfzffG15xl1wo0xBZ3HdZdqF2GUniEcNbtVjS1FKzQwPfsYPHMC
Y58qT0U2ZgK1zsXj2o0D2RWrCv3DFFfwUgNyZRYN2HK32umY6OmGSOVuJvIKhT+X6YaCVy
ax3CHv2ByB2OTBl9mh4nrwYAVXToT+X2psBE+MKB5R85lrUGkl3GtymTk10Dvf5O80exdT
LFRMvkCA5RAIZgvxMk/bbNaH/0UHQoctX9oaDeKGWUPfVaknFBQdU9009+lK/ocAlKVNHE
Qkw+1wuV6dFoT1/hngSw==
---- END SSH2 PUBLIC KEY ----

должен стать

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAnvYlVooXGoj3+7huZBUqf4wj57r25SHCKiiShyla335flX7Rsmb4meExpdh2NzfzffG15xl1wo0xBZ3HdZdqF2GUniEcNbtVjS1FKzQwPfsYPHMCY58qT0U2ZgK1zsXj2o0D2RWrCv3DFFfwUgNyZRYN2HK32umY6OmGSOVuJvIKhT+X6YaCVyax3CHv2ByB2OTBl9mh4nrwYAVXToT+X2psBE+MKB5R85lrUGkl3GtymTk10Dvf5O80exdTLFRMvkCA5RAIZgvxMk/bbNaH/0UHQoctX9oaDeKGWUPfVaknFBQdU9009+lK/ocAlKVNHEQkw+1wuV6dFoT1/hngSw== user@winhost

4. проверить это

c:\>ssh user@lnxhost "ls -al /tmp/"

Это должно перечислить содержимое / tmp без запроса пароля.


1
👍 для шага 3. authorized_keysВсе, что мне нужно, - это переформатировать в одну строку!
patricktokeeffe

рад, что это помогло вам - проголосуйте за ответ :)
Deian

5

Если у вас нет ssh-copy-idWindows, вы можете запустить его на самом сервере.

  • В PuTTYgen загрузите свой закрытый ключ (.ppk);
  • Скопируйте содержимое поля Открытый ключ для вставки в файл авторизованных ключей OpenSSH в буфер обмена.
  • Вставьте его в ваш любимый редактор (подойдет Windows Notepad).
  • Сохраните содержимое в файл с .pubрасширением.
  • Загрузите .pubфайл на сервер.
  • Войдите на сервер с помощью SSH-клиента, например, PuTTY.
  • На сервере тип:

    ssh-copy-id -i mykey.pub username@localhost
    

На Windows ssh-copy-idскрипт поставляется с Git для Windows . Так что вы можете использовать это локально, если у вас есть Git для Windows.


Если вы не хотите делать это вручную, вы можете использовать WinSCP 5.15. Он может настроить аутентификацию с открытым ключом для вас.
Используйте инструмент> Установить открытый ключ в сервере кнопку на SSH> Authentication странице диалога WinSCP Дополнительных настроек сайта .

введите описание изображения здесь

(Я автор WinSCP)


Это должен быть принятый ответ: git-bash для Windows 7; Linux Подсистема доступна в Windows 10
Alex

0

Если вы используете cmder (или msysgit / mingw, в котором есть scp & ssh), я просто написал для этого простой скрипт на python. Его можно найти здесь: https://gist.github.com/ceilfors/fb6908dc8ac96e8fc983

Пример использования: python ssh-copy-id.py user @ remote-machine.

Пароль будет запрошен при запуске скрипта.


почему это требует cmder?
Давид Зоричта

@ user57411 Это не требует cmder, это требует команд scp и ssh.
Ceilfors

0

что я сделал, имея CygWin на Win10, подключаясь к Linux (основываясь на ответе выше):

- примечание: при использовании cat он автоматически разрешит путь cygwin, а также любую команду cygwin, использующую структуру cygwin-linux-folder-Structure

1. added c:\cygwin\bin to the environment's Path variable
2. starting cmd.exe (windows commandline)
3. > ssh-keygen -t rsa   (just pressing enter till done)
4. > cat ~/.ssh/id_rsa.pub | ssh user@server "umask 077; test -d ~/.ssh || mkdir ~/.ssh ; cat >> ~/.ssh/authorized_keys"
5. ..enter server password
6. > ssh user@server (testing, not beeing asked for password)

0

Следующие шаги будут делать:

ШАГ-1: Генерация пары ключей RSA

C:\Users\user>ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/user//.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/user//.ssh/id_rsa.
Your public key has been saved in /c/Users/user//.ssh/id_rsa.pub.
The key fingerprint is:
20:16:9b:0d:00:92:c4:34:99:51:20:b7:ef:50:c4:0f user@localhost

STE2-2: ssh-copy-id эквивалентен в Windows

C:\Users\user>ssh user@remote "umask 077; test -d .ssh || mkdir .ssh ; cat >> .s
sh/authorized_keys || exit 1" < "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys
 || exit 1" < C:\Users\user\.ssh\id_rsa.pub
The authenticity of host 'remote (xx.xx.xxx.xx)' can't be established.
RSA key fingerprint is 99:99:73:74:fe:14:bc:91:c8:3b:ac:f4:95:99:4d:06.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'remote,xx.xx.xxx.xx' (RSA) to the list of known hosts.
*************************************************************************
This computer system is the property of Sample Corporation and is to
be used for business purposes.  All information, messages, software and
hardware created, stored, accessed, received, or used by you through
this system is considered to be the sole property of Sample Corporation
and can and may be monitored, reviewed, and retained at any time.  You
should have no expectation that any such information, messages or
material will be private.  By accessing and using this computer, you
acknowledge and consent to such monitoring and information retrieval.
By accessing and using this computer, you also agree to comply with
all of Sample Company's policies and standards.
*************************************************************************
user@remote's password:[Enter Password for first time]

ШАГ-3: аутентификация без пароля работает!

C:\Users\user>ssh user@remote
*************************************************************************
This computer system is the property of Sample Corporation and is to
be used for business purposes.  All information, messages, software and
hardware created, stored, accessed, received, or used by you through
this system is considered to be the sole property of Sample Corporation
and can and may be monitored, reviewed, and retained at any time.  You
should have no expectation that any such information, messages or
material will be private.  By accessing and using this computer, you
acknowledge and consent to such monitoring and information retrieval.
By accessing and using this computer, you also agree to comply with
all of Sample Company's policies and standards.
*************************************************************************
Last login: Wed Oct 14 14:37:13 2015 from localhost


0

Версия Powershell для SSH включена в Git For Windows

На самом деле, это может работать так долго, как у вас sshна пути. Добавьте следующее в свой профиль powershell:

function ssh-copy-id([string]$userAtMachine){   
    $publicKey = "$ENV:USERPROFILE" + "/.ssh/id_rsa.pub"
    if (!(Test-Path "$publicKey")){
        Write-Error "ERROR: failed to open ID file '$publicKey': No such file"            
    }
    else {
        & cat "$publicKey" | ssh $userAtMachine "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1"      
    }
}

В консоли PowerShell:

ssh-copy-id user@machine

ssh-copy-id не должен генерировать ключ, если он не существует.
RalfFriedl

@RalfFriedl Я удалил кейген
Fab
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.