Czy istnieje odpowiednik ssh-copy-id dla Windows?

56

Czy jest dostępny odpowiednik lub port ssh-copy-id dla Windows? To znaczy, czy istnieje prosty sposób na przeniesienie kluczy SSH z komputera lokalnego na zdalny serwer w systemie Windows?

Jeśli to pomoże, już używam Pageant i Kitty (alternatywa Putty).

Matt V.
źródło

Odpowiedzi:

27

ssh-copy-id to dość prosty skrypt, który powinien być dość łatwy do replikacji pod Windows.

Jeśli zignorujesz całą obsługę parametrów, obsługę błędów itd., Są to dwie komendy z ssh-copy-id, które faktycznie wykonują pracę przez większość czasu.

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

Za pomocą narzędzi szpachlowych takie polecenie powinno być równoważne (nie testowane).

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

Jeśli chcesz wykonać tę samą obsługę błędów i automatyczną lokalizację klucza, na pewno napisanie skryptu pod Windows będzie o wiele trudniejsze, ale na pewno możliwe.

Zoredache
źródło
1
Dzięki! Na początku nie mogłem go uruchomić; Otrzymywałem błędy „odmowa dostępu”, ale plink nie przestawał pozwalać mi na wpisanie hasła. Następnie spróbowałem przekazać hasło plink używając przełącznika -pw i to zadziałało. Czy wiesz, czy istnieje sposób, aby połączyć się z linkiem, aby wprowadzić hasło w połowie?
Matt V.
Nie jestem pewien co do uwierzytelnienia hasła i połączenia. Ilekroć faktycznie go używam, mam już mój klucz w systemie i uruchamiam pagent.
Zoredache,
4
plink.exe -pw passwordPracuje. Również jeśli wiesz, że .ssh / Author_keys istnieje, polecenie jest po prostutype id_rsa.pub | plink.exe -ssh user@host -pw password "cat >> .ssh/authorized_keys"
KCD
@KCD Wystarczy, jeśli .ssh/katalog istnieje. >>Przekierowanie będzie następnie utworzyć plik, jeśli nie istnieje.
pabouk
20

Te odpowiedzi mi nie pomogły. Naprawdę nie potrzebowałem żadnych szalonych scenariuszy. Utworzyłem klucz publiczny na moim komputerze klienckim w git bash i próbowałem skopiować go na VPS.

Po utworzeniu klucza publicznego klucz powinien być przechowywany jako „(bez względu na folder, w którym zacząłeś) /. Ssh / id_rsa.pub”

Więc użyj tego polecenia:
cat ~/.ssh/id_rsa.pub | ssh [email protected] "cat >> ~/.ssh/authorized_keys" gdzie userjest twoja nazwa użytkownika (czasami „root” lub cokolwiek, co skonfigurowałeś) i zamień 123.45.67.89na adres IP komputera / hosta / VPS.

Jeśli katalog .sshnie został jeszcze utworzony na komputerze hosta, użyj tej małej odmiany:
cat ~/.ssh/id_rsa.pub | ssh [email protected] "mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys"

Augie Gardner
źródło
2
Chciałbym mieć więcej głosów! 👍 dla jednej linii!
patricktokeeffe
16

ssh-copy-id robi kilka rzeczy (przeczytaj stronę podręcznika, aby uzyskać szczegółowe informacje), ale najważniejsze jest to, aby dołączyć zawartość lokalnego pliku klucza publicznego do pliku zdalnego o nazwie klucze_autoryzowane.

  • Możesz to zrobić samodzielnie, otwierając plik klucza za pomocą edytora tekstu i wklejając zawartość w terminalu Kitty.
    echo 'long_line_with_contents_of_public_key_file' >> .ssh/authorized_keys

  • Alternatywnie, możesz przesłać plik za pomocą WinSCP (który używa sftp lub scp jako zastępczy) i zrobić coś podobnego do mojej poprzedniej sugestii, bez brzydkiego kopiowania / wklejania.
    cat id_rsa.pub >> .ssh/authorized_keys
    gdzie id_rsa.pub jest nazwą przesłanego klucza publicznego.

Kenny Rasschaert
źródło
5

Zainspirowany odpowiedzią zoredache, stworzyłem kilka skryptów w wersji dla systemu Windows. Jednak wszystkie zależą od łącza. Proszę spojrzeć tutaj

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

Mam również skrypt winscp, którego można użyć zgodnie z inną odpowiedzią. :) Fragment pliku readme:

Dotychczasowe próby:

  • DOS (.cmd) - sukces
  • VBS (.vbs) - sukces
  • Powershell (.ps1) - Sukces
  • mremoteNG (aplikacja ext) - sukces
    • Wybierz Host, kliknij prawym przyciskiem myszy, narzędzia zewnętrzne, wybierz Scriptname
  • Skrypt WinSCP (.bat) - sukces
    • # "WinSCP.com" /script=".\Scriptname" /parameter "user[:password]@example.com" "id_rsa.pub" [/log=".\copyssh.log]"
Vijay
źródło
1
Te są całkiem słodkie
Pred
5

W systemie Windows 7 jest plik ssh.exe

Oto, co zadziałało dla mnie:

1. utwórz tożsamość (w systemie Windows)

c:\>ssh-keygen

To utworzyło plik tożsamości w katalogu domowym. Zmieniłem nazwę klucza publicznego na „id_rsa”

2. skopiuj plik do docelowego systemu linux, korzystając z Kredytów ssh na https://serverfault.com/users/984/zoredache w celu uzyskania odpowiedzi

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

Uwaga: z jakiegoś powodu nie działało dla mnie pipowanie:

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

3. Popraw plik w systemie linux Plik id_rsa.pub w systemie Windows jest wielowierszowy, w którym linux oczekuje go w jednym wierszu, więc musimy go nieco poprawić. Zaloguj się do systemu Linux i otwórz plik:

vi ~/.ssh/authorized_keys

Na przykład:

---- 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 ----

powinno stać się

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

4. przetestuj

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

Powinno to wyświetlić zawartość / tmp bez pytania o hasło.

Deian
źródło
1
👍 dla kroku 3. authorized_keysPotrzebne mi było przeformatowanie do pojedynczych linii!
patricktokeeffe
cieszę się, że pomogło ci - up głosuj odpowiedź :)
Deian
5

Jeśli nie masz ssh-copy-idsystemu Windows, możesz uruchomić go na samym serwerze.

  • W PuTTYgen załaduj swój klucz prywatny (.ppk);
  • Skopiuj zawartość pola Klucz publiczny do wklejenia do pliku kluczy autoryzowanych OpenSSH do schowka.
  • Wklej go do swojego ulubionego edytora (wystarczy Notatnik Windows).
  • Zapisz zawartość do pliku z .pubrozszerzeniem.
  • Prześlij .pubplik na serwer.
  • Zaloguj się do serwera za pomocą klienta SSH, takiego jak PuTTY.
  • Na typie serwera:

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

W systemie Windows ssh-copy-idskrypt jest dostarczany z Git dla Windows . Możesz więc użyć tego lokalnie, jeśli masz Git dla Windows.


Jeśli nie chcesz tego robić ręcznie, możesz użyć WinSCP 5.15. Może skonfigurować uwierzytelnianie za pomocą klucza publicznego.
Użyj Narzędzia> Zainstaluj klucz publiczny w serwerze na stronie SSH> Strona uwierzytelniania w oknie dialogowym Zaawansowane ustawienia witryny WinSCP .

wprowadź opis zdjęcia tutaj

(Jestem autorem WinSCP)

Martin Prikryl
źródło
To powinna być zaakceptowana odpowiedź: git-bash dla Windows 7; Podsystem Linux dostępny w systemie Windows 10
Alex
0

Jeśli używasz cmder (lub msysgit / mingw, który ma scp & ssh), właśnie napisałem do tego prosty skrypt pythona. Można go znaleźć tutaj: https://gist.github.com/ceilfors/fb6908dc8ac96e8fc983

Przykładowe użycie: python ssh-copy-id.py użytkownik @ maszyna zdalna.

Hasło zostanie wyświetlone po uruchomieniu skryptu.

pułapy
źródło
dlaczego to wymaga cmder?
David Zorychta
@ user57411 Nie wymaga cmder, wymaga poleceń scp i ssh.
ceilfors
0

co zrobiłem, mając CygWin na moim Win10, łącząc się z Linuksem (w oparciu o powyższą odpowiedź):

- uwaga: przy użyciu cat automatycznie rozpozna ścieżkę cygwin, a także dowolne polecenie cygwin wykorzystujące strukturę folderów cygwin-linux-folder

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)
BananaAcid
źródło
0

Wykonaj następujące kroki:

KROK-1: Wygeneruj parę kluczy 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: Odpowiednik ssh-copy-id w systemie 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]

KROK 3: Uwierzytelnianie bez hasła działa!

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
GANESZ
źródło
0

Wersja PowerShell dla SSH zawarta w Git dla Windows

W rzeczywistości może działać tak długo, jak masz sshna swojej drodze. Dodaj następujące elementy w swoim profilu 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"      
    }
}

W konsoli PowerShell:

ssh-copy-id user@machine
Fab
źródło
ssh-copy-id nie powinien generować klucza, jeśli nie istnieje.
RalfFriedl,
@RalfFriedl Usunąłem keygen
Fab