web-dev-qa-db-ja.com

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

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

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

sshを介してそのようなことは可能ですか?

9
Srikanth

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

#!/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

9
Arcege

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

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

7
MattBianco

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

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

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

3
Johan

Arcegeによるスクリプト の別のオプションは、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を引いた数)。
0
gadamiak

man expect? :\

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

0
LanceBaynes

たぶん

ssh user@Host sh -c "$(<filename)"
0
glenn jackman

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

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

0
Faheem Mitha