Linuxホストから sftp を使ってログファイルをリモートホストに転送する必要があります。私は自分の運用グループから同じアカウント情報を受け取りました。しかし、私は他のホストを制御することができないので、RSAキーを生成して他のホストと共有することはできません。
では、Bashスクリプトの中から cron ジョブを使ってsftp
コマンドを(ユーザー名とパスワードを指定して)実行する方法はありますか?
私は同じようなスタックオーバーフローの質問を見つけました、Bashスクリプトでsftpにパスワードを指定します私の問題に対する満足のいく答えはありません。
公開鍵認証を使用する以外にいくつかの選択肢があります。
あなたがsshpassにチャンスを与えることに決めたならば、ここにそうするための実用的なスクリプトスニペットがあります:
export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-Host << !
cd incoming
put your-log-file.log
bye
!
もう1つの方法は、lftpを使用することです。
lftp sftp://user:password@Host -e "put local-file.name; bye"
この方法の欠点は、コンピューターの他のユーザーがps
のようなツールからパスワードを読み取ることができることと、パスワードがシェルの履歴の一部になる可能性があることです。
LFTP 4.5.0以降で利用可能な、より安全な方法は、LFTP_PASSWORD
環境変数を設定し、--env-password
を指定してlftpを実行することです。これが完全な例です。
LFTP_PASSWORD="just_an_example"
lftp --env-password sftp://user@Host -e "put local-file.name; bye"
LFTPにはクールなミラーリング機能も含まれています(転送確認後の削除 '--Remove-source-files'を含めることができます)。
lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com
期待するのは素晴らしいプログラムです。
Ubuntu上でそれをインストールします。
Sudo apt-get install expect
CentOSマシン上でそれをインストールします。
yum install expect
Sftpサーバーに接続してから、ローカルマシンからリモートsftpサーバーにローカルファイルをアップロードしたいとしましょう。
#!/usr/bin/expect
spawn sftp [email protected]
expect "password:"
send "yourpasswordhere\n"
expect "sftp>"
send "cd logdirectory\n"
expect "sftp>"
send "put /var/log/file.log\n"
expect "sftp>"
send "exit\n"
interact
これはあなたのパスワードでサーバへのsftp接続を開きます。
それから、ファイルをアップロードしたいディレクトリ、この場合は "logdirectory"に行きます。
これにより、/ var/log /にあるファイル名がfile.logのローカルディレクトリからリモートサーバーの "logdirectory"にログファイルがアップロードされます。
シェルスクリプトで対話的にlftpを使用して、次の操作を行うことにより、パスワードが.bash_historyなどに保存されないようにすることができます。
vi test_script.sh
以下をファイルに追加します。
#!/bin/sh
Host=<yourhostname>
USER=<someusername>
PASSWD=<yourpasswd>
cd <base directory for your put file>
lftp<<END_SCRIPT
open sftp://$Host
user $USER $PASSWD
put local-file.name
bye
END_SCRIPT
そして、:wq
と入力してプットファイルのホスト、ユーザー、パス、ディレクトリを編集した後、viエディターを書き込み/終了します。次に、スクリプトを実行可能chmod +x test_script.sh
にし、./test_script.sh
を実行します。
パスワードなしの認証を有効にすることで上書きできます。しかし、その前にキー(pub、priv)をインストールする必要があります。
ローカルサーバで以下のコマンドを実行してください。
Local $> ssh-keygen -t rsa
プロンプトが表示されたら、Enterキーを押します。値を入力する必要はありません。
Local $> cd .ssh
Local $> scp .ssh/id_rsa.pub user@targetmachine:
Prompts for pwd$> ENTERPASSWORD
次のコマンドを使用してリモートサーバーに接続します
Local $> ssh user@targetmachine
Prompts for pwd$> ENTERPASSWORD
リモートサーバで以下のコマンドを実行してください。
Remote $> mkdir .ssh
Remote $> chmod 700 .ssh
Remote $> cat id_rsa.pub >> .ssh/authorized_keys
Remote $> chmod 600 .ssh/authorized_keys
Remote $> exit
ローカルサーバーで次のコマンドを実行して、パスワードなしの認証をテストします。パスワードなしで接続する必要があります。
$> ssh user@targetmachine
私は最近、サーバ間のファイル転送を安全にするために、ftpからsftpに切り替えるように依頼されました。 Tectia SSHパッケージを使用しています。このパッケージには、コマンドラインでパスワードを渡すためのオプション--password
があります。
例:sftp --password="password" "userid"@"servername"
バッチの例
(
echo "
ascii
cd pub
lcd dir_name
put filename
close
quit
"
) | sftp --password="password" "userid"@"servername"
Helpコマンド(sftp -h
)を実行する前にさまざまなWebサイトを見ていたので、この情報を共有する必要があると思い、パスワードオプションを見て驚きました。
Sshpassとロックされた資格情報ファイルを組み合わせれば、実際には何でも安全です。資格情報ファイルを読むためのボックスにrootがあれば、とにかくすべての賭けはオフになります。
あなたはそれのためにsshpassを使うことができます。以下が手順です
Sudo apt-get install sshpass
sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/Tomcat7/webapps
sftpがパスワードを要求するのを待ってから送信するBashプログラム:
#!/bin/bash
expect -c "
spawn sftp username@your_Host
expect \"Password\"
send \"your_password_here\r\"
interact "
あなたはexpectをインストールする必要があるかもしれません、あなたのプロンプトが受け取るものと一致するように小文字の「p」に「パスワード」の表現を変更してください。ここでの問題は、パスワードがファイル内とコマンド履歴内にプレーンテキストで表示されることです。そもそも、そもそもパスワードを所持するという目的に反します。