SFTPサーバーに接続されている自動バックアップ操作を実行する必要があります。最初のステップでは、サーバーに接続してサーバー接続をテストします。正しいサーバーに接続されていることを確認するために、StrictHostKeyChecking
ssh_configをyesに設定しました。
SFTPサーバーに接続するときにサーバーの応答をスクリプト化する方法は?疑似コードは次のとおりです。
If connection success
disconnect
initiate backup procedure
Else
log error
exit script
追加情報:
ForceCommand internal-sftp
バックアップサーバーでsshd_configを使用しているため、ssh
コマンドを実行できません。
答え1
ほとんどのSSHファイル転送プロトコル(SFTP)クライアントは、デフォルトで/元の対話型使用のために構築されています。
しかし、バッチモードオプションなどが不足しているという意味ではありませんが、SSHプロトコルを介したスクリプトベースのファイル転送を探している場合、scp
またはlftp
。
lftp
(家)これは私がすべての自動ファイル転送に使用するものであり、エラー処理に優れており、シャットダウン状態が安定しています。信頼性を念頭に置いて設計されています。
多数のオプションがあり、使用する特定のコネクタを指定するなど、必要に応じてlftp
提供できます。ssh
-oStrictHostKeyChecking=yes
例:
MYSSHOPTIONS="-oStrictHostKeyChecking=yes"
CONNPROG="ssh -a -x ${MYSSHOPTIONS}"
cat > ${cmdfile} <<- EOF
set sftp:max-packets-in-flight 16
set sftp:connect-program ${CONNPROG}
open -u ${remoteuser},${password-unless-pubkey-setup} sftp://${remotehost}
put localfile -o remotepathname
EOF
lftp -f ${cmdfile} > ${sendlog} 2>&1
RC=$?
if test $RC -ne 0
then
failed
else
reliably OK
fi
例は少し長いです。コマンドファイルを生成し、いくつかのオプションを設定し、あるファイルをアップロードし、オプションで別のファイルを反対側localfile
にアップロードします。remotepathname
これを無効にするには、sftpバリアントを使用できますlftp
。
SFTPログインアクセスの確認に興味がある場合は、このテンプレートを追加の実験の開始点として使用できます。
#!/bin/sh - mykey=/home/localuser/.ssh/id_rsa remusr=ブフューザー remhost=server.destination.domain.com tmpfile=/tmp/sftptest.$$ きれいだ() { rm -f ${tmpファイル} } トラップクリーンアップ0 # これは ~/.ssh/config のオプションに従います (おそらく /etc/ssh/ssh_config.d/*.conf かもしれません) # /etc/ssh/ssh_configに含まれている場合は、そこに提供されているオプションが適用されます。 sftp -i $mykey -oPubkeyAuthentication=yes -oPasswordAuthentication=no -oKbdInteractiveAuthentication=no -oStrictHostKeyChecking=yes ${remusr}@${remhost} ${tmpfile} 2>&1 目次 出口 EOF ST=$? $ST -ne 0 をテストする場合 それから echo SFTP ログインに失敗しました。 RC=${ST} 1>&2 $ST 終了 フィリピン諸島 cat ${tmpfile} # または巧妙な grep 演算を実行します。 $ST 終了
答え2
私はこれを行うためにExpectとbashスクリプトを書いています...
Bashスクリプト:ユーザー、パス、およびホストの3つのパラメータで実行されます。例えば./bwrap.sh ninja_user ninja_star1234 ninja.com
スクリプトは、後で成功したログイン/ログアウトを確認するために使用されるログファイルを生成します。
#!/bin/bash
# log file
log="connection_test.log"
if [ -f $log ];
then
echo "Older file $log exists, removing and creating new..."
rm -rf $log
touch $log
else
echo "Creating log file"
touch $log
fi
# running expect script.
# arg 1 is user, arg 2 is pass, arg 3 is host
./one.exp $1 $2 $3 >> $log
# checking log for connections
if grep --quiet logout $log; then
echo "connection successful, proceeding to backup" >> $log
else
echo "connection failed, please check server" >> $log
exit 1
fi
これで、予想されるスクリプトには10秒のタイムアウトがあります。実際、私は厳密なホストキーなしで作業することを好みます。本当に厳格なホストキーを使用するには、関連する行を編集し、予想される「はい/いいえ」を追加します。
#!/usr/bin/expect -f
set user [lindex $argv 0];
set password [lindex $argv 1];
set host [lindex $argv 2];
set timeout 10
# now ssh
spawn ssh $user@$host -o StrictHostKeyChecking=no
match_max 100000 # Look for passwod prompt
expect "*?assword:*"
# Send password aka $password
send -- "$password\r"
expect "*$ "
send -- "whoami\r"
expect "<user name>" # change user
send -- "exit\r"
expect eof
お役に立てば幸いです。
接続するには:sftp
ポートを含むスクリプトに行を追加します。bash
$4
./one.exp $1 $2 $3 $4 >> $log
expect
スクリプトに次の行を追加します。
set port [lindex $argv 3];
予想されるスクリプトを次のように置き換えます。
spawn ssh $user@$host -o StrictHostKeyChecking=no
そして
spawn sftp $host@$user -o Port=$port StrictHostKeyChecking=no
そして
expect "*$ "
そして
expect "sftp>"
テストするSFTPサーバーがないため、変更は[この質問]に基づいています。シェルスクリプトsftpファイルの使用
また[予想ホームページ]:http://expect.sourceforge.net/ 非常に便利かもしれません。
最後に、直接方法についてのコメントを読んだら、単に使用してnc
ホスト:ポートが機能していることを確認できます。これを行うには、次のものを使用できます。
#!/bin/bash
# log file
log="connection_test.log"
if [ -f $log ];
then
echo "Older file $log exists, removing and creating new..."
rm -rf $log
touch $log
else
echo "Creating log file"
touch $log
fi
# nc
nc_command=`nc -z -w 5 $1 $2 | tee -a $log`
if [[ $nc_command == *succeeded* ]];
then
echo "Server is listening, ready for backup" | tee -a $log
else
echo " Server seems to be offline, please check" | tee -a $log
exit 1
fi
最後のスクリプトを実行するには、次を使用します。./test.sh host port
答え3
バックアップスクリプトがPythonベースの場合は、次のことを検討してください。check_sftp、Checkmkが提供するいわゆるアクティブチェックです。 SFTPサーバーを確認する特定のユースケースがあります。 Pythonと純粋なPython SSHの実装に基づいているためパラミコ、Pythonだけです。これには、パスワードの保存やOMD_ROOTの統合などの一部のCheckmkの詳細が含まれており、独立して機能するには削除する必要があります。しかし、PUTまたはGETファイルオプションを含め、サーバーのタイムスタンプを比較するなど、少し複雑なので、試してみる価値があります。ついてくるからNagios検査プラグインガイド、成功のために終了コードを使用できます0
。
別のPythonベースのオプションは次のとおりです。構造(またParamikoベース)または使用Paramiko用SFTPモジュールまっすぐ。
答え4
sftp
接続テストを実行してssh
接続をテストできます。
if $(ssh -q [email protected] exit)
then
echo yes
fi
サーバーがこれを許可しない場合はssh
使用できますが、nmap
これはキー認証をテストしません。
nmap myserver.bfworks.com -PN -p ssh | grep 'open'