scpにパスワードを渡す方法は?


297

お勧めしませんが、ユーザーのパスワードをscpに渡すことは可能ですか?

バッチジョブの一部としてscpを介してファイルをコピーしたいのですが、もちろん、受信側のサーバーにはパスワードが必要ですが、パスワードベースの認証に簡単に変更することはできません。


2
(後の)質問も参照してください:stackoverflow.com/questions/1462284/…1つの回答でこれを行う別の可能な方法について言及しています (注:これは重複する質問ではありません。他の質問と同じです。)
Jonathan Leffler

回答:


35

expectなどのツールを使用してスクリプトを作成できます(Python用のPexpectなどの便利なバインディングもあります)。


1
expect.nist.govへのリンクが壊れています。たぶんこれ?:expect.sourceforge.net
Katapofatico

sudo apt-get install expect
SDsolar 2017年

>> brew info sshpassエラー:「sshpass」という名前の使用可能な数式はありません。初心者のSSHユーザーがSSHのセキュリティを台無しにすることがあまりにも簡単になるため、sshpassは追加しません。;)
Lukas NP Egger 2018年

528

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/sshpass.rb

14
Ubuntu 12.04では、パスワードに単一引用符を使用した場合にのみ機能しました(たとえば、「password」ではなく「password」)。
odedfos 2014

6
@odedfos、はい。一部のパスワード生成文字は二重引用符で囲まれた文字列補間で特別な解釈ができるため、単一引用符を使用する必要があります
TerryE

7
sshpassのインストール方法apt-get install sshpass
Jan-

6
CentOSの上では、だyum -y install sshpass
jgritty

19
これを行うための最も安全な方法は、パスワードであるファイルをこのように、:sshpass -f passwdfile` SCP [...] . This way, the password won't show up in などps`リスト、そしてあなたは、ファイルのアクセス権とパスワードを保護することができます。
Christopher Schultz

50

次のようなsshキーを生成するだけです:

ssh-keygen -t rsa -C "your_email@youremail.com"

の内容をコピーし、~/.ssh/id_rsa.pub 最後にリモートマシンに追加する~/.ssh/authorized_keys

リモートマシンに権限が0700 for ~./ssh folderあり、0600 for ~/.ssh/authorized_keys


35
私が書いたように:いいえ、キーベースの認証に簡単に切り替えることはできません。
Argelbargel

3
ではなく.authorized_keysを意味しますか?authorization_keys?
HelloWorld 2015

2
これの有効な使用法は、リモートサーバーのパスワードをユーザーに要求するサーバーに対して複数のscp / ssh呼び出しを行うbashスクリプトです。その後、パスワードは履歴に表示されなくなり、パスワードに挑戦するのに適した状態になります...一度だけです。スクリプトユーザーを認証したいので、キーファイルを使用しません。
Wes Grant、

2
別の有効な使用法は、ターゲットでキーベースの認証を簡単に有効にできない場合です。例:メインのNASプロデューサーの1つ-DSM 6.0を搭載したSynologyは、2016年でもそれをサポートしていません。確かに、設定ファイルをいじって、更新によって再度上書きされないようにすることができます(DSMを頻繁に更新すると、カスタム変更が壊れます) )。時々-特にOPが明確に書いているとき、彼らはすでに最適ではないことを知っている-人々はただ解決策を必要としています。
Aaa

3
ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>リモートサーバー上のキーをコピーするために使用する必要があります
RousseauAlexandre

39

Windowsからサーバーに接続している場合、scp( "pscp")のPuttyバージョンでは、-pwパラメーターを使用してパスワードを渡すことができます。

これは、ここのドキュメントで言及されています。


1
例を示してください。
SDsolar 2017年

また、これらのコマンドを使用するためにパスにC:\ Program Files(x86)\ PuTTYを追加することもできます。
SDsolar 2017年

1
@SDsolarはここに構文例があります:(pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest私はこのようにパテを使うのは嫌いですが、うまくいきます)
geneorama

29

curlはscpの代わりにファイルをコピーするために使用でき、コマンドラインでパスワードをサポートします。

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

「scp」よりもかなり遅いですが、うまく機能します。
ビクター

宛先が非常に長いパスワードプロンプト遅延で設定されている場合、これがより高速であることがわかりました。 scpパスワードを入力するには30秒以上待つ必要がありますが、curlすぐに機能しました。
Ghost8472 2018

@ Ghost8472は「はい」と設定されていますが、この遅延によりホスト名が解決されることがあり、sftpでも発生することがあります。
mckenzm

1
「curl:(1)プロトコル「sftp」はlibcurlでサポートされていないか無効になっています」
kronuus

21

unix / terminalで 'expect'スクリプトを使用できます

たとえば、「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}
                  }

スクリプトを実行する

expect test.exp 

お役に立てば幸いです。


7
前提条件:sudo apt-get install expect
SDsolar 2017年

10

これは、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;
}

2
これはperlにありますが、申し訳ありませんでした。(5年前:))
Espo


3

ssh-copy-idsshキーの追加に使用できます。

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

存在する場合:

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

3

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入力すると、パスワードなしでコマンドが実行されます。


2
  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 /root/scriptfile


1

以下は、このブログ投稿に基づく、貧しい人のLinux / Python / Expectに似た例です:単純なシェルを完全にインタラクティブなTTYにアップグレードする。Expectをインストールしたり、Pythonにモジュールを追加したりできない古いマシンにこれが必要でした。

コード:

(
    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")'

出力:

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

代わりの方法は、ユーザーの鍵の公開半分をターゲットシステムの承認済み鍵ファイルに追加することです。転送を開始するシステムで、ssh-agentデーモンを実行して、鍵の秘密の半分をエージェントに追加できます。バッチジョブは、キーのパスワードを要求するのではなく、エージェントを使用して秘密キーを取得するように構成できます。

これは、UNIX / LinuxシステムまたはWindowsプラットフォームでpageantとpscpを使用して実行できるはずです。


4
質問は、彼が鍵ベースの認証を使うことができないと言いました。
Barmar

2
また、それが私であれば、他のサーバーを変更できないと思います-ファイルをコピーするだけです。
SDsolar 2017年

-1

上記のすべてのソリューションは、アプリがインストールされている場合、またはやsshpassを除いてインストールする管理者権限を持っている場合にのみ機能します。

scpをバックグラウンドで開始するだけの非常に便利なリンクを見つけました。

$ 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
バックグラウンドでscpを実行すると、どのようにパスワードが入力されますか?
thomas.han


-9

私はこの非常に役立つ答えをここで見つけまし

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

そこにパスワードを渡すことができるだけでなく、コピーするときに進行状況バーを表示します。本当に素晴らしい。


22
ここで正確にパスワードを提供していますか?
infografnet 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.