exit
SSHセッションでコマンドが正常に実行されたことを確認したいと思います。
私の最初の試みは次のコマンドを使用しました。
exit && echo $? || echo $?`.The `echo $? || echo $?
0
正常に終了したら印刷する必要があります。問題は、echo
実行が成功してもexit
接続が失われ、その後のコマンドが失われるため実行されないことです。
2番目の試みは、コマンドを2つのコマンドに分割することでした。
$ exit
$ echo $?
echo $?
0
exit
実行が成功したら、そうする必要があります。しかし、あまりにも速く転送され、実行される前にリモートSSHホストに到達する echo $?
ため、別の問題が飲み込まれる可能性があります。exit
exit
それでは、次のコマンドが送信される前にリモートホストで実行されているかどうかを確認できますか?
アップデート#1
使用手順は、プログラミング言語でシェルコマンドを実行し、SSHパイプストリームを介してメッセージを送信することです。したがって、exit
コマンドがいつ実行されるのかわかりません。コマンドが完了しない場合は、exit
後続のコマンドが既存のホストに送信されると無視されます。
そのため、exit
実行されたコマンドに興味があります。
アップデート#2
1. どの段階で問題が発生しましたか?
最初は問題をできるだけ簡単に説明しようとしましたが、もっと混乱しているようです。私はScalaでSSHライブラリを書いています。子ライブラリ。
対話型端末ではありません。リモートホストからの応答メッセージはネットワーク IO ストリームとして、プログラムによって保存され、結果は文字列として解析されます。つまり、各文字コードを処理し、最終的にコマンド実行の成功または失敗を決定する必要があります。
一部のサンプルコードは次のとおりです。
//create a ssh by JSch library which is a SSH implement by Java Language.
val shell = Shell(Auth("host", "username", 22, "mypassword"))
//execute shell command as we do at terminal for example.
val rst1 = shell.exc("ls")
//create a new shell based on this shell.
val newShell = shell.newShell(Auth("xxx.xxx.xxx.xxx", "username2", 22, "mypassword"))
//do something on the new shell
val rst2 = newShell.exc("touch somefile")
//exit from new shell
newShell.exit()
sent 一般コマンドによってnewShell
生成されるので魔法ではありません。たとえば、一般的なコマンドを送信するのと同じです。 sshpass -p 'password' ssh -T username@hostname
JSch
ls
問題はexit()
メソッドの実装にあります。 Scalaコードを無視すると、次のシェルコマンドになります。
$ echo '' && echo 'some-splitter-string' && exit
$ echo $? && echo 'some-splitter-string'
そのコマンドをリモートホストに送信した後、応答は次のようになると予想しましたが、そうでなく、\n
直接読み取れるように文字を明示的に追加しました。
\n
some-splitter-string\n
0\n
some-splitter-string\n
これは、IOストリームを半分に分割し、some-splitter-string
内部的に0
(おそらく他の人が)exit
コマンドの実行が完了したと判断できることを意味します。これはシェルコマンドの結果をデコードするためのプロトコルです。
2.問題は正確に何ですか?
実際、exit()
コマンドは私に答えます。
\n
some-splitter-string\n
2番目のコマンドがecho $? && echo 'some-splitter-string'
ありません!これは、コマンドが$ echo $? && echo 'some-splitter-string'
newShellホストにも送信されるためです。
ただし、exit
完了後、コマンドは newShell ホストによって無視されました。このコマンドを簡単に考えてみてくださいexit && touch somefile
。後者はtouch somefile
決して実行できません。
私の現在の解決策は、コマンドを送信してから1秒間眠るのですecho '' && echo 'some-splitter-string' && exit
。よりエレガントでなければなりません。したがって、実行を保証する方法を探したいと思い、プロトコルを完了するexit
ために2番目のコマンドを送信します。
3. 説明が必要ないくつかの質問:
どのように終了"実行"が失敗することができますか?
現時点では、失敗や成功に完全に焦点を当てません。つまりexit
、失敗できない場合は完了したことを教えてください。ここでシェル終了について話していますか?
はい、質問の目的は、SSHパイプライン環境で完全なシャットダウンコマンドを実行することを決定する方法を見つけることです。