私はクライアントとサーバーの両方でBashを使用しています。 SSH経由でコマンドを実行する場合:
ssh <host> 'declare'
シェル変数のリストを提供します。ssh <host> 'mount'
マウントポイントのリストを提供します。
しかし、declare
これはBashの組み込みコマンドmount
ですが、外部コマンドです。同じ名前の組み込みシェルと外部コマンドがサーバーに存在する場合、SSHはどのコマンドを実行するかをどのように知ることができますか?
答え1
ssh
次のように、リモートユーザーのシェル/etc/passwd
から提供されたコマンドを実行します。ソースコード:
argv[0] = (char *) shell0;
argv[1] = "-c";
argv[2] = (char *) command;
argv[3] = NULL;
execve(shell, argv, env);
したがって、あなたの例では、リモートサーバーで実行する対応するコマンドは次のようになります。
bash -c declare
bash -c mount
それらはすべて渡され、bash
評価されます。組み込みコマンドは内部的に評価され、ローカルコマンドラインプロンプトで実行したように外部コマンドを呼び出します。