私のスクリプトには次のものがあります。
connectionTest=$(sshpass -p "${pass}" ssh -q -o ConnectTimeout=5 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "${remoteUser}"@"${IP}" "echo quit | netcat -w 5 local.server.local ${telnetPort}; echo $?")
コマンドを受け取り、コンピュータで手動で実行すると、予期した終了コードが表示されます。ただし、スクリプトが実行されるたびに生成される終了コードは次のとおりです。いつも0.
終了コードが常にゼロを返すのはなぜですか?
答え1
予期しない戻り状態を受け取る理由は、リモートホストへのコマンドの引用によるものです。
次の2つの声明を考慮し、対照してください。
a=apple; ssh remotehost "a=banana; echo $a"
a=apple; ssh remotehost 'a=banana; echo $a'
最初のケースでは、"... $a"
評価今後コマンドを実行すると、ssh
次の有効な状況が発生します。
ssh remotehost "a=banana; echo apple"
2番目のケースでは'... $a'
合格文字通りの意味で実行のためにリモートホストに接続すると、次の有効な状況が発生します。
ssh remotehost 'a=banana; echo $a'
これはまさにあなたのものです$?
。二重引用符で囲まれているため、コマンドを実行する前に評価されます。 0の値は前のコマンドからのものなので、どうすればよいですか?効果的に実行すると、次のようになります。
connectionTest=$(sshpass -p PASSWORD ssh ... "REMOTEUSER@REMOTEIP "echo quit | netcat ... ; echo 0")
必要なのは、単一引用符を使用して、ローカルシェルがそれをリテラルとして処理するようにすることです。次のようになります。
connectionTest=$(sshpass -p "${pass}" ssh ... "${remoteUser}@${IP}" "echo quit | netcat -w 5 local.server.local ${telnetPort}; "'echo $?')
たとえば、2つの部分で構成される文字列は"hello"'world'
単一の値に連結されますhelloworld
。最初の部分は変数評価を実行しますが、2番目の部分は実行しません。