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