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.


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:



528

Gunakan sshpass :

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

atau lebih, kata sandi tidak ditampilkan dalam bash history

sshpass -f "/path/to/passwordfile" scp -r user@example.com:/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

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 "your_email@youremail.com"

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


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.


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/

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.


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

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"

3

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

scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/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 remote@ip.com:/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.


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


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 jmudd@mysite.com:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

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

Keluaran:

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

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.


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/


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


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


22
dan bagaimana tepatnya Anda memberikan kata sandi di sini?
infografnet
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.