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.

Argelbargel
źródło
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).

Pat Notz
źródło
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 [email protected]:/some/remote/path /some/local/path

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

sshpass -f "/path/to/passwordfile" scp -r [email protected]:/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
KevinS
źródło
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 "[email protected]"

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

Mustafaturan
źródło
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.

gWay
źródło
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/
MBerg
źródło
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.

Prabhjeet
źródł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;
}
Espo
źródło
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"
Shen JI
źródło
3

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

scp -i ~/.ssh/id_rsa /local/path/to/file [email protected]:/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 [email protected]:/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.

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

Kevin Chui
źródło
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 [email protected]:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

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

Wynik:

scp [email protected]:install.sh .
bash-4.2$ scp [email protected]:install.sh .
Password: 
install.sh                                 100%   15KB 236.2KB/s   00:00    
bash-4.2$ exit
exit
JohnMudd
źródło
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.

rjray
źródło
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/

Yash
źródło
1
W jaki sposób uruchomienie scp w tle wprowadzi hasło?
thomas.han
-3

kroki, aby uzyskać sshpass Dla rhel / centos 6:

# wget http://epel.mirror.net.in/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum install sshpass

źródło: https://community.mapr.com/thread/9040

Długo
źródło
-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.

łoś
źródło
22
i jak dokładnie podajesz tutaj hasło?
infografnet