SFTP経由でファイルをバックアップするスクリプトを作成しようとしています。問題は、パスワードが必要であり、SFTPに手動でパスワードを指定する方法がないことです。公開鍵を使用してパスワードを要求しないと聞いたことがありますが、リモートサーバーにSSHで接続し、一部の構成ファイルを変更できる必要がありますが、これはできません。
現在の私の解決策は cURL を使用することですが、それは安全ではありません(通常のFTPを使用します)。 .netrc
ファイルも調べましたが、SFTPではなくFTP用のようです。 sftpのパスワードを手動で指定するにはどうすればよいですか?
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
マニュアル で説明されているように、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.
シェルからすばやく呼び出すことができるため、python(paramikoモジュール)の使用を検討することもできます。
pip install paramiko
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 )
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」が表示されるのを待ち、コマンドを送信します。その後終了します。
これを機能させるには:
次に実行します:
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 "
コマンドラインからssh/scpまたはsftpにパスワードを指定することはできません。パスワードの入力を求めずに接続する唯一の方法は、公開鍵認証を使用することです。
サーバーにsshで構成ファイルを変更することはできないと言いますが、サーバーにsftpで接続できる場合は、おそらく公開鍵をアップロードできます。
公開鍵は、ホームディレクトリの.sshディレクトリの下に置くだけです。
公開鍵を使用するために、「構成ファイル」を変更する必要はありません。公開鍵のコピーをsshが確認できる場所(通常は~/.ssh/authorized_keys
)。これはsftpで実行できます。サーバー上にauthorized_keysファイルを確立していない場合は、id_rsa.pubファイルをその場所に配置するだけです。