Jak przekazać hasło do SCP?


296

Wiem, że nie jest to zalecane, ale czy w ogóle można przekazać hasło użytkownika do scp?

Chciałbym skopiować plik za pomocą scp jako część zadania wsadowego, a serwer odbierający oczywiście potrzebuje hasła i nie mogę go łatwo zmienić na uwierzytelnianie oparte na kluczach.


2
Zobacz także (później) pytanie: stackoverflow.com/questions/1462284/…, gdzie jedna odpowiedź wymienia inny możliwy sposób, aby to zrobić. (Uwaga: nie jest to duplikat pytania - to oryginał, który duplikują inni).
Jonathan Leffler,

Odpowiedzi:


35

Możesz napisać skrypt za pomocą narzędzia takiego jak expect (istnieją również przydatne wiązania, takie jak Pexpect for Python).


1
Link do expect.nist.gov jest zepsuty. Może to ?: expect.sourceforge.net
Katapofatico

sudo apt-get install expect
SDsolar

>> Informacje o zaparzeniu Błąd sshpass: Brak dostępnej formuły o nazwie „sshpass” Nie dodamy sshpass, ponieważ zbyt początkującym użytkownikom SSH zbyt łatwo psuje bezpieczeństwo SSH. ;)
Lukas NP Egger

528

Użyj sshpass :

sshpass -p "password" scp -r user@example.com:/some/remote/path /some/local/path

tak więc hasło nie pojawia się w historii bash

sshpass -f "/path/to/passwordfile" scp -r user@example.com:/some/remote/path /some/local/path

Powyższe kopiuje zawartość ścieżki ze zdalnego hosta do twojego lokalnego.

Zainstalować :

  • ubuntu / debian
    • apt install sshpass
  • centos / fedora
    • yum install sshpass
  • mac w / macports
    • port install sshpass
  • Mac w / nap
    • brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb

14
W systemie Ubuntu 12.04 działało dla mnie tylko z pojedynczymi cudzysłowami nad hasłem (np. „Hasło” zamiast „hasło”).
odedfos

6
@odedfos, tak, musisz używać pojedynczych cudzysłowów, ponieważ niektóre znaki generowane hasłem mogą mieć specjalną interpretację w interpolacji ciągów podwójnych cudzysłowów
TerryE

7
Tak instalujesz sshpassapt-get install sshpass
Jan-Terje Sørensen

6
Na CentOS jestyum -y install sshpass
jgritty

19
Najbezpieczniejszym sposobem na to jest użycie pliku haseł , takiego jak: listy sshpass -f passwdfile` scp [...] . This way, the password won't show up in ps`, itp. I możesz zabezpieczyć hasło za pomocą uprawnień do plików.
Christopher Schultz

49

po prostu wygeneruj klucz ssh, taki jak:

ssh-keygen -t rsa -C "your_email@youremail.com"

skopiuj zawartość ~/.ssh/id_rsa.pub i dodaj ją na odległych komputerach~/.ssh/authorized_keys

upewnij się, że zdalny komputer ma uprawnienia 0700 for ~./ssh folderi0600 for ~/.ssh/authorized_keys


35
Jak napisałem: Nie, nie mogę łatwo przejść na uwierzytelnianie oparte na kluczach.
Argelbargel

3
Czy chodzi Ci raczej o .authorized_keys? klucze autoryzacji?
HelloWorld,

2
Prawidłowym zastosowaniem tego jest skrypt bash, który wykonuje wiele wywołań scp / ssh do serwera, na którym chcesz zapytać użytkownika o hasło do zdalnego serwera. Hasło nie pojawi się w historii, a Ty nadal będziesz musiał się o niego ubiegać ... ale tylko raz. Nie chcę używać pliku klucza, ponieważ nadal chcę uwierzytelnić użytkownika skryptu.
Wes Grant,

2
Kolejnym prawidłowym zastosowaniem byłoby, jeśli nie można łatwo włączyć uwierzytelniania opartego na kluczach w obiekcie docelowym. Przykład: Jeden z głównych producentów NAS - Synology z ich DSM 6.0 - nie obsługuje go nawet w 2016 roku. Jasne, możesz zepsuć się plikami konfiguracyjnymi i mam nadzieję, że aktualizacja nie zastąpi go ponownie (aktualizacja DSM często psuje modyfikacje niestandardowe ). Czasami - zwłaszcza gdy OP wyraźnie pisze, że już wiedzą, że to nie jest optymalne - ludzie potrzebują rozwiązania.
Aaa

3
Należy użyć ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>do skopiowania klucza na zdalnym serwerze
RousseauAlexandre

39

Jeśli łączysz się z serwerem z Windows, Putp w wersji scp („pscp”) pozwala przekazać hasło z -pwparametrem.

Jest to wspomniane w dokumentacji tutaj.


1
Proszę podać przykład.
SDsolar

Ponadto, możesz chcieć dodać C: \ Program Files (x86) \ PuTTY do ścieżki, aby użyć tych poleceń.
SDsolar

1
@SDsolar oto przykład składni: pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest(Nienawidzę używania takiego kitu, ale działa)
genorama

29

curl może być używany jako alternatywa dla scp do kopiowania pliku i obsługuje hasło w wierszu poleceń.

curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/

Jest dość wolniejszy niż „scp”, ale dobrze sobie radzi.
Victor

Stwierdziłem, że jest to szybsze, gdy miejsce docelowe jest skonfigurowane z dużym opóźnieniem hasła. scpmusi czekać ponad 30 sekund, aby pozwolić mi wprowadzić hasło, ale curlzadziałało natychmiast.
Ghost8472,

@ Ghost8472 skonfigurowano tak, ale czasami to opóźnienie rozwiązuje nazwę hosta, a także dzieje się w przypadku sftp.
mckenzm

1
Mam „curl: (1) protokół„ sftp ”nie obsługiwany lub wyłączony w libcurl”
kronuus

21

Możesz użyć skryptu „expect” na unix / terminal

Na przykład utwórz „test.exp”:

#!/usr/bin/expect
        spawn scp  /usr/bin/file.txt root@<ServerLocation>:/home
        set pass "Your_Password"
        expect {
        password: {send "$pass\r"; exp_continue}
                  }

uruchom skrypt

expect test.exp 

Mam nadzieję że to pomogło.


7
Wymaganie wstępne: sudo apt-get install install
SDsolar

10

Oto przykład tego, jak to zrobić za pomocą expectnarzędzia:

sub copyover {
    $scp=Expect->spawn("/usr/bin/scp ${srcpath}/$file $who:${destpath}
+/$file");
    $scp->expect(30,"ssword: ") || die "Never got password prompt from
+ $dest:$!\n";
    print $scp 'password' . "\n";
    $scp->expect(30,"-re",'$\s') || die "Never got prompt from parent 
+system:$!\n";
    $scp->soft_close();
    return;
}

2
To jest w Perlu, przepraszam, że tego nie napisałem. (5 lat temu :))
Espo


3

Możesz użyć, ssh-copy-idaby dodać klucz ssh:

$which ssh-copy-id #check whether it exists

Jeśli istnieje:

ssh-copy-id  "user@remote-system"

3

Po skonfigurowaniu w ssh-keygensposób opisany powyżej możesz to zrobić

scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

Jeśli chcesz za każdym razem zmniejszać pisanie, możesz zmodyfikować .bash_profileplik i umieścić

alias remote_scp='scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

Następnie z terminala source ~/.bash_profile. Następnie, jeśli wpiszesz remote_scpswój terminal, powinien on uruchomić scppolecenie bez hasła.


2
  1. upewnij się, że masz narzędzie „oczekuj”, jeśli nie, zrób to

    # apt-get install expect

  2. utwórz plik skryptu o następującej treści. (# vi / root / scriptfile)

    spawn scp /path_from/file_name user_name_here@to_host_name:/path_to

    expect "password:"

    send put_password_here\n;

    interact

  3. uruchom plik skryptu za pomocą narzędzia „expect”

    # expect /root/scriptfile


1

Oto przykład podobny do Linuksa / Pythona / Oczekiwania biedaka oparty na tym wpisie na blogu: Uaktualnianie prostych powłok do w pełni interaktywnych TTY . Potrzebowałem tego na starych komputerach, na których nie mogę zainstalować Oczekiwać ani dodawać modułów do Pythona.

Kod:

(
    echo 'scp jmudd@mysite.com:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

python -c 'import pty; pty.spawn("/usr/bin/bash")'

Wynik:

scp jmudd@mysite.com:install.sh .
bash-4.2$ scp jmudd@mysite.com:install.sh .
Password: 
install.sh                                 100%   15KB 236.2KB/s   00:00    
bash-4.2$ exit
exit

0

Alternatywą byłoby dodanie publicznej połowy klucza użytkownika do pliku kluczy autoryzowanych w systemie docelowym. W systemie, z którego inicjujesz transfer, możesz uruchomić demona ssh-agent i dodać do agenta prywatną połowę klucza. Zadanie wsadowe można następnie skonfigurować tak, aby korzystało z agenta w celu uzyskania klucza prywatnego, zamiast monitować o hasło klucza.

Powinno to być możliwe w systemie UNIX / Linux lub na platformie Windows za pomocą pageant i pscp.


4
Pytanie brzmiało, że nie może używać uwierzytelniania opartego na kluczach.
Barmar

2
Ponadto, gdybym to był ja, zakładam, że nie mogę zmienić innego serwera - chcę tylko skopiować plik.
SDsolar

-1

Wszystkie powyższe rozwiązania mogą działać tylko wtedy, gdy aplikacja jest zainstalowana lub powinieneś mieć uprawnienia administratora do zainstalowania oprócz lub sshpass.

Znalazłem ten bardzo przydatny link, aby po prostu uruchomić SCP w tle.

$ nohup scp file_to_copy user@server:/path/to/copy/the/file > nohup.out 2>&1

https://charmyin.github.io/scp/2014/10/07/run-scp-in-background/


1
W jaki sposób uruchomienie scp w tle wprowadzi hasło?
thomas.han


-9

Znalazłem tę naprawdę pomocną odpowiedź tutaj .

rsync -r -v --progress -e ssh user@remote-system:/address/to/remote/file /home/user/

Nie tylko możesz przekazać tam hasło, ale także pokaże pasek postępu podczas kopiowania. Naprawdę niesamowite.


22
i jak dokładnie podajesz tutaj hasło?
infografnet
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.