SFTPログイン状態をテストするスクリプト?

SFTPログイン状態をテストするスクリプト?

SFTPサーバーに接続されている自動バックアップ操作を実行する必要があります。最初のステップでは、サーバーに接続してサーバー接続をテストします。正しいサーバーに接続されていることを確認するために、StrictHostKeyCheckingssh_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'

関連情報