ssh リモート ファイル実行が機能しない

ssh リモート ファイル実行が機能しない

test.sh次のコマンドを含むbashスクリプトがあります

#!/bin/bash

PASSWORD=""
USERNAME=""
REM_HOSTNAME='localhost'

FILES_TO_COPY="remote_exec.sh"


function scptmp {
    exec sshpass -p $PASSWORD scp -o "ConnectTimeout 3" \
        -o "StrictHostKeyChecking no" \
        -o "UserKnownHostsFile /dev/null" \
        "$@"
}

echo -e "\tCopying files to remote host..."
scptmp -r -q $FILES_TO_COPY $USERNAME@$REM_HOSTNAME:/tmp

echo -e "\tSet execution privs on remote file..."
sshpass -p "$PASSWORD" ssh -t -oStrictHostKeyChecking=no $USERNAME@$REM_HOSTNAME "echo $PASSWORD | sudo -S chmod +x /tmp/$FILES_TO_COPY"

echo -e "\Execute..."
sshpass -p "$PASSWORD" ssh -oStrictHostKeyChecking=no -t $USERNAME@$REM_HOSTNAME "echo $PASSWORD | sudo -S bash /tmp/$FILES_TO_COPY"

そして、remote_exec.sh次の内容です:

#!/bin/bash

hostname=`hostname`
mkdir $hostname

スクリプトを実行すると

bash test.sh

エラーは表示されませんが、remote_exec.shディレクトリが作成されていないため、ホスト上で実行されていないようです。

何が問題なのか分かる人はいますか?

答え1

execを使用すると、現在のシェルを、次のコマンドを実行した結果のプロセスに置き換えます。つまり、関数を呼び出すと、scptmp現在スクリプトを実行しているシェルがプロセスに置き換えられますsshpass。関数内のユーティリティの実行が終了するとsshpass、スクリプトは実行されなくなります。

答え2

一重引用符は、その中の変数の評価を禁止します。二重引用符を試してください:

sshpass -p $PASSWORD ssh -t user@host "echo $PASSWORD | sudo -S bash /tmp/remote_exec.sh"

答え3

私の場合、ユーザーがスクリプトを実行して初めてリモートに接続しました。そのため、

SSH <REMOTE_IP>

影響を受けるユーザーと。「ホストの信頼性」に関するプロンプトが表示される場合は、これが問題である可能性があります。

The authenticity of host '<REMOTE-IP>' can't be established.
Are you sure you want to continue connecting (yes/no)? yes

環境とポリシーに応じて、スクリプトを確認して再起動するだけで済みます。

答え4

次のことを試してください。

sshpass -p $PASSWORD ssh -t user@host<<EOF
echo uname -a
cd /tmp/ || exit 1
echo $PASSWORD | sudo -S bash ./remote_exec.sh
exit $?

EOF

関連情報