[linux] 如何將密碼傳遞給scp?



Answers

使用sshpass

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

或者密碼不會顯示在bash歷史記錄中

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

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

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




我發現這裡真的很有幫助。

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

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




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

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

如果存在:

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



以下是您如何使用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. 確保你有“期望”的工具,如果沒有,做到這一點

    # apt-get install expect

  2. 創建一個包含以下內容的腳本文件。 (#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. 用“expect”工具執行腳本文件

    # expect /root/scriptfile




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

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

如果你想減少每次輸入,你可以修改你的.bash_profile文件並放置

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

然後從你的終端執行source ~/.bash_profile 。 之後,如果您在終端中輸入remote_scp ,它應該運行沒有密碼的scp命令。







Links