web-dev-qa-db-ja.com

Bashスクリプトでsftpのパスワードを指定する

SFTP経由でファイルをバックアップするスクリプトを作成しようとしています。問題は、パスワードが必要であり、SFTPに手動でパスワードを指定する方法がないことです。公開鍵を使用してパスワードを要求しないと聞いたことがありますが、リモートサーバーにSSHで接続し、一部の構成ファイルを変更できる必要がありますが、これはできません。

現在の私の解決策は cURL を使用することですが、それは安全ではありません(通常のFTPを使用します)。 .netrcファイルも調べましたが、SFTPではなくFTP用のようです。 sftpのパスワードを手動で指定するにはどうすればよいですか?

8
Eli

Lftpでは、ftpとsftpの両方のパスワードを指定でき、公開鍵はまったく必要ありません。 sh同期スクリプトは次のようになります。

#!/bin/sh
# Define folders
THEFOLDER='/mnt/my/folder'
# List files
THEFILES=`ls -p $THEFOLDER | grep -v "/"`

for file in $THEFILES
do
  echo "Processing $file"
  lftp -u login,password -e "put $THEFOLDER/$file;quit"  theftp/sub/folder
done
7
Ilya Kharlamov

マニュアル で説明されているように、cURLはsftpをサポートできます。

USING PASSWORDS

 FTP

   To ftp files using name+passwd, include them in the URL like:

        curl ftp://name:[email protected]:port/full/path/to/file

   or specify them with the -u flag like

        curl -u name:passwd ftp://machine.domain:port/full/path/to/file

 FTPS

   It is just like for FTP, but you may also want to specify and use
   SSL-specific options for certificates etc.

   Note that using FTPS:// as prefix is the "implicit" way as described in the
   standards while the recommended "explicit" way is done by using FTP:// and
   the --ftp-ssl option.

 SFTP / SCP

   This is similar to FTP, but you can specify a private key to use instead of
   a password. Note that the private key may itself be protected by a password
   that is unrelated to the login password of the remote system.  If you
   provide a private key file you must also provide a public key file.
5
Qiang Xu

シェルからすばやく呼び出すことができるため、python(paramikoモジュール)の使用を検討することもできます。

モジュールをインストールします

pip install paramiko

FTPアップロードスクリプトの例

import paramiko

username = 'my_username'
password = 'my_password'

transport = paramiko.Transport((server, 22))
transport.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(transport)    

local_filename = '/tmp/filename'
remote_filename = 'MyFiles/temp.txt'

sftp.put( local_filename, remote_filename )
4
Homer6

sftpがパスワードを要求するのを待ってから送信するBashプログラム:

#!/bin/bash
expect -c "
spawn sftp username@your_Host
expect \"assword\"
send \"your_password_here\r\"
interact "

それをsftp_autologin.shというファイルに入れてください。 \rは、コマンドを実行するためにsftpにを送信します。一部のシステムでは大文字であるため、他のシステムでは小文字であるため、パスワードに「p」を含めません。 expectはsftpコマンドを生成します。文字列「assword」が表示されるのを待ち、コマンドを送信します。その後終了します。

これを機能させるには:

  1. インストール期待、私は5.44.1.15を使用しています
  2. インタラクティブモードでボックスにsftpして、パスワードを入力できることを確認してください。
  3. このbashスクリプトに実行可能権限があることを確認してください。

次に実行します:

chmod +x sftp_autologin.sh
./sftp_autologin.sh

パスワードの入力を求められることなく、sftpコマンドラインに移動するはずです。

安全ではありませんか?

それはあなたが実行できる最も安全でないコマンドについてです。これは、パスワードをコマンドライン履歴、「ps」出力を読み取ることができる他のすべての人に公開し、基本的にパスワードの目的全体を一斉に無効にします。

しかし、詐欺の火に関する別のログは何ですか、それは年間犠牲者の損失でわずか約2500億ドルです。 500bに行きましょう。

これにより、sftpシェルでいくつかのコマンドが自動的に実行され、完了すると自動的に終了します:

#!/bin/bash
expect -c "
spawn sftp [email protected]
expect \"assword\"
send \"yourpassword\r\"
expect \"sftp\"
send \"get your_directory/yourfilename.txt\r\"
expect \"sftp\"
send \"exit\r\"
interact "
2
Eric Leschinski

コマンドラインからssh/scpまたはsftpにパスワードを指定することはできません。パスワードの入力を求めずに接続する唯一の方法は、公開鍵認証を使用することです。

サーバーにsshで構成ファイルを変更することはできないと言いますが、サーバーにsftpで接続できる場合は、おそらく公開鍵をアップロードできます。

公開鍵は、ホームディレクトリの.sshディレクトリの下に置くだけです。

2
Jared Kells

公開鍵を使用するために、「構成ファイル」を変更する必要はありません。公開鍵のコピーをsshが確認できる場所(通常は~/.ssh/authorized_keys)。これはsftpで実行できます。サーバー上にauthorized_keysファイルを確立していない場合は、id_rsa.pubファイルをその場所に配置するだけです。

1
kojiro