Bagaimana cara mengirimkan kata sandi ke scp?

297

Saya tahu ini tidak disarankan, tetapi apakah mungkin untuk meneruskan kata sandi pengguna ke scp?

Saya ingin menyalin file melalui scp sebagai bagian dari pekerjaan batch dan server penerima tentu saja membutuhkan kata sandi dan, tidak, saya tidak dapat dengan mudah mengubahnya ke otentikasi berbasis kunci.

Argelbargel
sumber
2
Lihat juga (nanti) pertanyaan: stackoverflow.com/questions/1462284/… di mana satu jawaban menyebutkan cara lain yang memungkinkan untuk melakukan ini. (NB: ini bukan pertanyaan duplikat - itu adalah asli yang duplikat lainnya.)
Jonathan Leffler

Jawaban:

35

Anda dapat skrip dengan alat seperti harapkan (ada juga binding berguna, seperti Pexpect untuk Python).

Pat Notz
sumber
1
Tautan ke expect.nist.gov rusak. Mungkin ini ?: expect.sourceforge.net
Katapofatico
sudo apt-get install expect
SDsolar
>> brew info sshpass Kesalahan: Tidak ada rumus yang tersedia dengan nama "sshpass" Kami tidak akan menambahkan sshpass karena terlalu mudah bagi pengguna SSH pemula untuk merusak keamanan SSH. ;)
Lukas NP Egger
528

Gunakan sshpass :

sshpass -p "password" scp -r [email protected]:/some/remote/path /some/local/path

atau lebih, kata sandi tidak ditampilkan dalam bash history

sshpass -f "/path/to/passwordfile" scp -r [email protected]:/some/remote/path /some/local/path

Salinan konten jalur di atas dari host jarak jauh ke lokal Anda.

Install :

  • ubuntu / debian
    • apt install sshpass
  • centos / fedora
    • yum install sshpass
  • mac dengan macport
    • port install sshpass
  • mac w / brew
    • brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb
KevinS
sumber
14
Di Ubuntu 12.04 ini hanya berfungsi untuk saya dengan tanda kutip tunggal di atas kata sandi (mis. 'Kata sandi' bukan "kata sandi").
odedfos
6
@odedfos, ya Anda perlu menggunakan tanda kutip tunggal karena beberapa karakter yang dihasilkan kata sandi dapat memiliki interpretasi khusus dalam interpolasi string yang dikutip ganda
TerryE
7
Ini adalah bagaimana Anda menginstal sshpassapt-get install sshpass
Jan-Terje Sørensen
6
Di CentOS ituyum -y install sshpass
jgritty
19
Cara paling aman untuk melakukan ini adalah dengan file kata sandi , seperti ini: sshpass -f passwdfile` scp [...] . This way, the password won't show up in ps` listing, dll. Dan Anda dapat melindungi kata sandi dengan izin file.
Christopher Schultz
50

cukup buat kunci ssh seperti:

ssh-keygen -t rsa -C "[email protected]"

menyalin konten ~/.ssh/id_rsa.pub dan terakhir menambahkannya ke mesin jarak jauh~/.ssh/authorized_keys

pastikan mesin jarak jauh memiliki izin 0700 for ~./ssh folderdan0600 for ~/.ssh/authorized_keys

mustafaturan
sumber
35
Seperti yang saya tulis: Tidak, saya tidak dapat dengan mudah beralih ke otentikasi berbasis kunci.
Argelbargel
3
Maksud Anda .authorized_keys daripada. kunci otorisasi?
HelloWorld
2
Penggunaan yang valid untuk ini adalah skrip bash yang melakukan beberapa panggilan scp / ssh ke server tempat Anda ingin meminta kata sandi untuk server jarak jauh kepada pengguna. Kata sandi tidak akan ditampilkan dalam riwayat dan Anda masih harus menantikan kata sandi ... tetapi hanya sekali. Saya tidak ingin menggunakan file kunci karena saya masih ingin mengotentikasi pengguna skrip.
Wes Grant
2
Penggunaan lain yang valid adalah jika Anda tidak dapat dengan mudah mengaktifkan otentikasi berbasis kunci pada target. Contoh: Salah satu produsen NAS utama - Synology dengan DSM 6.0 mereka - tidak mendukungnya bahkan pada tahun 2016. Tentu saja, Anda dapat mengacaukan dengan file konfigurasi dan berharap pembaruan tidak hanya akan menimpanya lagi (memperbarui DSM sering tidak mengubah modifikasi kustom ). Terkadang - terutama ketika OP secara tegas menulis mereka sudah sadar itu tidak optimal - orang hanya perlu solusi.
Aaa
3
Anda harus menggunakan ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>untuk menyalin kunci di server jauh
RousseauAlexandre
39

Jika Anda terhubung ke server dari Windows, versi Putty dari scp ("pscp") memungkinkan Anda meneruskan kata sandi dengan -pwparameter.

Ini disebutkan dalam dokumentasi di sini.

gWay
sumber
1
Tolong tunjukkan contoh.
SDsolar
Juga, mungkin ingin menambahkan C: \ Program Files (x86) \ Putty ke jalur Anda untuk menggunakan perintah ini.
SDsolar
1
@ SDsolar di sini adalah contoh sintaks: pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest(Saya benci menggunakan dempul seperti ini, tetapi berfungsi)
geneorama
29

curl dapat digunakan sebagai alternatif untuk scp untuk menyalin file dan mendukung kata sandi pada commandline.

curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/
MBerg
sumber
Ini lebih lambat dari 'scp' tapi itu berfungsi dengan baik.
Victor
Saya menemukan ini lebih cepat ketika tujuan dikonfigurasi dengan penundaan prompt kata sandi yang besar. scpharus menunggu lebih dari 30 detik untuk membiarkan saya memasukkan kata sandi, tetapi curlsegera berfungsi.
Ghost8472
@ Ghost8472 dikonfigurasi ya, tetapi kadang-kadang keterlambatan ini menyelesaikan nama host, dan juga terjadi untuk sftp.
mckenzm
1
Saya mendapat "curl: (1) Protocol" sftp "tidak didukung atau dinonaktifkan di libcurl"
kronuus
21

Anda dapat menggunakan skrip 'harapkan' di unix / terminal

Misalnya buat '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}
                  }

jalankan skrip

expect test.exp 

Saya harap itu membantu.

Prabhjeet
sumber
7
Prasyarat: sudo apt-get install expect
SDsolar
10

Berikut ini adalah contoh bagaimana Anda melakukannya dengan expectalat:

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
sumber
2
Ini dalam perl, maaf saya tidak menulis itu. (5 tahun yang lalu :))
Espo
3

Anda dapat menggunakan ssh-copy-iduntuk menambahkan kunci ssh:

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

Jika ada:

ssh-copy-id  "user@remote-system"
Shen JI
sumber
3

Setelah Anda mengatur ssh-keygenseperti yang dijelaskan di atas, Anda dapat melakukannya

scp -i ~/.ssh/id_rsa /local/path/to/file [email protected]:/path/in/remote/server/

Jika Anda ingin mengurangi pengetikan setiap kali, Anda dapat memodifikasi .bash_profilefile Anda dan meletakkannya

alias remote_scp='scp -i ~/.ssh/id_rsa /local/path/to/file [email protected]:/path/in/remote/server/

Kemudian dari terminal Anda lakukan source ~/.bash_profile. Setelah itu, jika Anda mengetik remote_scpdi terminal Anda harus menjalankan scpperintah tanpa kata sandi.

hai15
sumber
2
  1. pastikan Anda memiliki alat "harapkan" sebelum, jika tidak, lakukanlah

    # apt-get install expect

  2. buat file skrip dengan konten berikut. (# 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. jalankan file skrip dengan alat "harapkan"

    # expect /root/scriptfile

Kevin Chui
sumber
1

Berikut ini contoh orang miskin seperti Linux / Python / Expect yang didasarkan pada posting blog ini: Meningkatkan shell sederhana menjadi TTYs yang sepenuhnya interaktif . Saya membutuhkan ini untuk mesin lama di mana saya tidak dapat menginstal Harapkan atau menambahkan modul ke Python.

Kode:

(
    echo 'scp [email protected]:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

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

Keluaran:

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

Alternatifnya adalah menambahkan setengah publik dari kunci pengguna ke file kunci-resmi pada sistem target. Pada sistem tempat Anda memulai transfer, Anda dapat menjalankan daemon ssh-agent dan menambahkan separuh kunci privat ke agen. Pekerjaan batch kemudian dapat dikonfigurasi untuk menggunakan agen untuk mendapatkan kunci pribadi, daripada meminta kata sandi kunci.

Ini harus bisa dilakukan pada sistem UNIX / Linux atau pada platform Windows menggunakan pageant dan pscp.

rjray
sumber
4
Pertanyaannya mengatakan dia tidak bisa menggunakan otentikasi berbasis kunci.
Barmar
2
Juga, jika itu saya, saya berasumsi saya tidak dapat mengubah server lain - yang saya inginkan hanyalah menyalin file.
SDsolar
-1

Semua solusi yang disebutkan di atas hanya dapat berfungsi jika Anda menginstal aplikasi atau Anda harus memiliki hak admin untuk menginstal kecuali atau sshpass.

Saya menemukan tautan yang sangat berguna ini untuk memulai scp di Background.

$ 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
sumber
1
Bagaimana menjalankan scp di latar belakang memasukkan kata sandi ??
thomas.han
-3

langkah-langkah untuk mendapatkan sshpass Untuk 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

sumber: https://community.mapr.com/thread/9040

Panjang
sumber
-9

Saya menemukan jawaban yang sangat membantu di sini .

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

Anda tidak hanya dapat meneruskan kata sandi, tetapi juga akan menampilkan bilah kemajuan saat menyalin. Sangat mengagumkan.

Valk
sumber
22
dan bagaimana tepatnya Anda memberikan kata sandi di sini?
infografnet