非対話型ログインシェルを学習する過程で、SSHを介してリモートでコマンドを実行する2つの方法が見つかりました。私にとっては、それらはすべて同じように見えます。しかし、残念ながらそうではありません。
コマンドを使用すると、echo "shopt login_shell; echo \$-" | ssh -l poweruser 192.168.1.67
次のような結果が出力されます。
Pseudo-terminal will not be allocated because stdin is not a terminal.
[email protected]'s password:
login_shell on
hBs
ただし、コマンドを使用すると、ssh -l poweruser 192.168.1.67 "shopt login_shell; echo \$-"
他の結果が表示されます。
[email protected]'s password:
login_shell off
hBc
2番目のケースでは、パスワードの入力を求められますが、シェルがログインシェルではない理由を教えてください。
答え1
もし注文する指定すると、ログインシェルではなくリモートホストで実行されます。
その理由は、ある場合にはコマンドを指定し、他の場合には指定せず、意図的にssh
(設計に応じて)これらのケースでは異なる動作をするからです。
コマンドを指定しないと、パイプ入力を読み取り実行するログインシェルが起動します。コマンドを提供したところで始まりました。
パスワードを求めるメッセージは関係ありません。これは、シェルまたはコマンドを実行する前にサーバーにユーザーの身元を認証するためのものです。
答え2
これは不正確ですが、これを調べるのに便利な方法です。
echo … | ssh …
インタラクティブセッションと「似ている」 -ssh
標準入力からシェルコマンドを読むことから始まります。もちろん今ssh
できる標準入力がパイプかtty(またはファイル)かを区別しますが、おそらくそうしません。 ttyとは異なる方法でパイプを処理すると、次のようなものを使用するのがより困難になる可能性があります。expect
(マニュアルページ)。echo … | ssh …
誰かに電話して何かをしてもらうように頼むような気がします。あなたは彼らがそうしたいと思うかもしれません。まもなく (まだ通話中)ログインシェルがより適切であると感じます。を使用すると、接続が確立される前に実行するコマンドを指定できます。表示された応答に基づいて条件付きで操作を実行することは不可能です(何かが間違っている場合は+をクリックした場合を除く)。だからそれはインタラクティブにすることはできません。
ssh … command
ssh
CtrlCバッチ処理。まるで誰かにメールを送って何かをしてもらうような気がします。即時の応答を期待していないので、ログインシェルが正しくないと感じます。
背景については、以下を参照してください。「非ログイン」シェルの代わりに「ログイン」シェルを使用するのはなぜですか? (そのうち - 公開 - 唯一の答えは私が書いた) ログインシェルと非ログインシェルの違いは何ですか?- 一見しても、この質問と直接的な関連がある内容は見えませんでした。