web-dev-qa-db-ja.com

Bashスクリプトからパスワードを指定してsftpコマンドを実行する方法

Linuxホストから sftp を使ってログファイルをリモートホストに転送する必要があります。私は自分の運用グループから同じアカウント情報を受け取りました。しかし、私は他のホストを制御することができないので、RSAキーを生成して他のホストと共有することはできません。

では、Bashスクリプトの中から cron ジョブを使ってsftpコマンドを(ユーザー名とパスワードを指定して)実行する方法はありますか?

私は同じようなスタックオーバーフローの質問を見つけました、Bashスクリプトでsftpにパスワードを指定します私の問題に対する満足のいく答えはありません。

157
anubhava

公開鍵認証を使用する以外にいくつかの選択肢があります。

  1. キーチェーンを使用する
  2. sshpass を使用します(安全性は低くなりますが、おそらくあなたの要件を満たしています)。
  3. expect を使用します(最低限のセキュリティとより多くのコーディングが必要)

あなたがsshpassにチャンスを与えることに決めたならば、ここにそうするための実用的なスクリプトスニペットがあります:

export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-Host << !
   cd incoming
   put your-log-file.log
   bye
!
159
anubhava

もう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
86
Karassik

期待するのは素晴らしいプログラムです。

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"にログファイルがアップロードされます。

45
rezizter

シェルスクリプトで対話的に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を実行します。

21
Mike S.

パスワードなしの認証を有効にすることで上書きできます。しかし、その前にキー(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
17
SriniV

私は最近、サーバ間のファイル転送を安全にするために、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サイトを見ていたので、この情報を共有する必要があると思い、パスワードオプションを見て驚きました。

15
Mahony

Sshpassとロックされた資格情報ファイルを組み合わせれば、実際には何でも安全です。資格情報ファイルを読むためのボックスにrootがあれば、とにかくすべての賭けはオフになります。

7
Rich Harding

あなたはそれのためにsshpassを使うことができます。以下が手順です

  1. Ubuntuにsshpassをインストールする - Sudo apt-get install sshpass
  2. 初めての場合は、リモートIPを既知のホストファイルに追加します。Ubuntuの場合 - > ssh user @ IP - >「yes」と入力します。
  3. scpとsshpassを組み合わせたコマンドを入力してください。以下はリモートTomcatに対処する戦争のためのサンプルコードですsshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/Tomcat7/webapps
5
ravi ranjan

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

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

あなたはexpectをインストールする必要があるかもしれません、あなたのプロンプトが受け取るものと一致するように小文字の「p」に「パスワード」の表現を変更してください。ここでの問題は、パスワードがファイル内とコマンド履歴内にプレーンテキストで表示されることです。そもそも、そもそもパスワードを所持するという目的に反します。

5
Eric Leschinski