2008-09-08 225 views
160

我知道這不被推薦,但它是否可以將用戶的密碼傳遞給scp?如何將密碼傳遞給scp?

我想通過scp複製文件作爲批處理作業的一部分,接收服務器當然需要密碼,不,我不能輕易將其更改爲基於密鑰的身份驗證。

+2

參見(稍後)的問題:http://stackoverflow.com/questions/1462284/how在使用scp-in-shell腳本時對密碼提示進行響應,其中一個答案提到另一種可能的方式來執行此操作。 (注意:這不是一個重複的問題 - 它是另一個重複的原始文件。) – 2009-09-22 20:50:54

回答

20

你可以用expect這樣的工具編寫腳本(也有方便的綁定,比如Python的Pexpect)。

+1

到http://expect.nist.gov/的鏈接已損壞。也許這個?:http://expect.sourceforge.net/ – Katapofatico 2016-10-04 16:08:12

+0

sudo apt-get install expect – SDsolar 2017-01-23 20:39:18

9

這裏是你如何與expect工具做一個例子:

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

作爲一個Linux noob,這是什麼運行? Bash不接受`sub` ... – 2013-06-20 19:57:15

+2

這是在Perl中,對不起,我沒有寫。 (5年前:)) – Espo 2013-06-24 06:46:53

1

另一種方法是用戶的密鑰的公共部分添加到授權密鑰在目標系統上的文件。在啓動傳輸的系統上,您可以運行ssh-agent守護進程並將私鑰的一半添加到代理。然後可以將批處理作業配置爲使用代理獲取私鑰,而不是提示密鑰的密碼。

這應該可以在UNIX/Linux系統或使用pageant和pscp的Windows平臺上執行。

+3

這個問題說他不能使用基於密鑰的身份驗證。 – Barmar 2015-09-30 19:00:36

+0

另外,如果是我,我認爲我不能改變其他服務器 - 我只想複製一個文件。 – SDsolar 2017-01-23 20:34:00

26

如果要從Windows連接到服務器,則可以使用Putty版本的scp(「pscp」)讓密碼與-pw參數一起傳遞。

This is mentioned in the documentation here.

+0

請舉例說明。 – SDsolar 2017-01-23 20:23:15

+0

此外,可能需要將C:\ Program Files(x86)\ PuTTY添加到您的路徑以使用這些命令。 – SDsolar 2017-01-23 20:38:51

+0

@SDsolar這裏有一個語法示例:'pscp -pw'MyPa $$ word'username @ servername:/ somedir/somefile〜/ somedest`(我討厭使用這樣的膩子,但它有效) – geneorama 2017-08-30 18:55:18

24

只是產生像SSH密鑰:

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

副本~/.ssh/id_rsa.pub ,最後的內容將其添加到遠程機器~/.ssh/authorized_keys

確保遠程機器擁有的權限0700 for ~./ssh folder0600 for ~/.ssh/authorized_keys

308

使用sshpass

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

左右沒有密碼在bash的歷史表明

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

路徑的上述副本內容從遠程主機到本地。

安裝:

  • 的ubuntu/Debian的
    • apt install sshpass
  • 的centos/fedora的
    • yum install sshpass
  • MAC W/MacPorts的
    • port install sshpass
  • MAC W/BREW
    • brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master‌​/Library/Formula/ssh‌​pass.rb
16

您可以使用 '預期' 腳本對UNIX /終端

例如創建 'test.exp來':

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

運行腳本

expect test.exp 

我希望幫助。

-8

我發現這個真的很有用答案here

rsync -r -v --progress -e ssh [email protected]:/address/to/remote/file /home/user/ 

不僅可以傳遞密碼,還可以在複製時顯示進度條。非常棒。

2
  1. 確保你之前,有 「預期」 的工具,如果沒有,這樣做

    # apt-get install expect

  2. 創建具有下列內容的腳本文件。 (#VI /根/腳本文件)

    spawn scp /path_from/file_name [email protected]_host_name:/path_to

    expect "password:"

    send put_password_here\n;

    interact

  3. 與 「預期」 工具執行腳本文件

    # expect /root/scriptfile

0

您可以使用ssh-copy-id添加SSH密鑰:

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

如果存在:

ssh-copy-id "[email protected]" 
1

一旦設置了ssh-keygen如上所述,你可以做

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

如果你想減少每次打字,你可以修改你.bash_profile文件,並把

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

然後從你的終端做source ~/.bash_profile。之後,如果在終端中鍵入remote_scp,它應該運行scp命令,而不使用密碼。

1

curl可以用來替代scp來複制文件,並且它在命令行上支持密碼。

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

步驟獲得sshpass爲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 

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

相關問題