非対話型ログインシェルについて学習している間に、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つ目のケースでは、パスワードの入力を求められたにもかかわらず、シェルがログインシェルではない理由を教えてください。
commandを指定すると、ログインシェルではなくリモートホストで実行されます。
その理由は、コマンドを指定した場合と指定しなかった場合の2つであり、ssh
は意図的に(設計上)これらの場合の動作が異なります。
コマンドを指定しなかったものでは、ログインシェルが起動され、パイプされた入力を読み取って実行しました。コマンドを提供したものでは、それが代わりに起動されました。
パスワードの入力は関係ありません。これは、シェルまたはコマンドが起動される前に、サーバーに対してユーザーを認証しています。