SSHを介してバッチモードでコマンドを実行する方法


9

ssh経由でバッチモードでコマンドを実行するにはどうすればよいですか?つまり、sshコマンドに相当するものは何sftp -b <filename> <hostname>ですか?

を介して接続している一連のホストで実行したい一連のコマンドがありますssh。以上sftp、コマンドをファイルに保存filenameしてホストに接続し、前述のコマンドを使用してコマンドを実行します。

そのようなことは可能sshですか?


私はこの質問を終えました。しかし、コマンドをバッチモードで実行する方法はまだわかりませんでした。
スリカンス

そして、誰かがタグ#batchmodeを作成して、この質問にタグを付けることができますか?
スリカンス

回答:


9

私が間違っている場合は修正してください。ただし、スクリプトがローカルにあるリモートサーバーで通常のシェルコマンドを実行したいようです。

#!/bin/sh
trap "rm -f /tmp/sendonssh.$$.*" 0 1 2 3 15
# commands to run on the remote server
cat <<'EOF' >> /tmp/sendonssh.$$.sh
mkdir -p /tmp/foobar.$$
mv $HOME/xyzzy /tmp/foobar.$$
chmod 640 $HOME/xyzzy
EOF
# call for each argument
for userhost in "$@"; do
    errorout=`ssh -aTxo BatchMode=yes $userhost /bin/sh -s < /tmp/sendonssh.$$.sh 2>&1`
    rc=$?
    if [ $rc -ne 0 ]; then
        echo "Error: $userhost: $errorout"
        exit $rc
    fi
done

シェルの代わりにPythonを使用して、テスト環境の「リモート実行」アプリでこれを行いますssh $userhost python < $pythonscriptfilename


答えてくれてありがとう。それはそのように見えます。私はそれを少し調整して、今それを試しています。
スリカンス

7

に相当するSSH sftp -b <filename> <hostname>は次のようになります。

ssh -o BatchMode=yes <hostname> sh -s < "<filename>"


3

それをシンプルに保ち、他のコンピュータで「バッチ」ファイルを実行するのはどうですか?

  1. scpバッチファイルuser @ pc
  2. ssh user @ pcバッチファイル
  3. ssh user @ pc rmバッチファイル

バッチファイルは通常のシェルスクリプトなので、構文はよく知られています。


0

man expect?:\

しかし、それは完璧な方法ではありません。


こんにちはjohnny8888です。Solarisサーバーを使用しており、手動で入力することはできません。答えを詳しく説明していただけますか?
スリカンス


@Srikanth:expect端末での実行を想定しているプログラムと対話するように設計されています。これは、sshでコマンドを実行する問題とは無関係です。
Gilles 'SO-悪をやめる'


0

sshの強制コマンドを使用できます。

これらは特定のキーに関連付けられています。そのキーで認証が完了すると、そのコマンドが実行され、接続が終了します。この方法の1つの利点は、セキュリティが向上することです。その場合、キーを使用してログインシェルにアクセスできないためです。


0

Arcegeによるスクリプトのもう1つのオプションは、Bash関数です。

sshbatch() {
  # Expect at least 2 parameters, if less are provided print help
  if [[ ${#@} -lt 2 ]]; then
    printf 'Usage: sshbatch [user@]host... input_file\n'
  else
    while read -r -u "$fd" host; do
      # Check if the last parameter is a readable file, else print error and exit
      [[ -r ${@:(-1)} ]] || { printf "The file ${@:(-1)} is not readable!\n"; break; }
      # Run remote bash from the file given in the last parameter
      ssh -o BatchMode=yes "$host" bash -s < "${@:(-1)}"
      # Read host list from 1st to next to last parameters
    done {fd}< <(printf '%s\n' "${@:1:${#@}-1}")
  fi
}

私はsshの-Tオプションを使用していません。すべてのケースで動作しないためです。

このスクリプトは、位置パラメーター配列でパラメーター拡張を使用します$@

  • "${@:(-1)}" 最後のパラメーターに展開します(文字通り最初から最後まで)
  • "${#@}" 位置パラメータの数に展開します
  • "${@:1:${#@}-1}" 最初から次から最後まですべてのパラメーターのリストに展開します(文字通りパラメーターの数から1を引いた数)。

私はそのような変数の展開があまり得意ではありません、あなたは何が起こっているのかを少し追加できますか?乾杯。
ガイ

@Guy、here you are —私はコードにコメントし、パラメータ展開に関するいくつかの説明を追加しました
gadamiak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.