ウェブサイトを検索しましたが、同様の問題と解決策を見つけることができませんでした。そこで、新しい質問をしました。いくつかの制限されたコマンドでカスタムシェルを構築しようとしています。出発点として、StephenBrennanが提供するこのカスタムシェルを使用しています。3つの組み込みコマンド(cd、help、exit)があり、システムコマンドを実行することもできます。
私はこの行を編集しました/etc/passwd
:
root:x:0:0:root:/root:/mnt/n1/custom-shell
また、この行をに追加しました/etc/shells
:
/mnt/n1/custom-shell
これで、を使用してリモートホストに接続できssh
、カスタムシェルが表示され、コマンドを入力できます。しかし、を使用してコマンドを直接実行することはできませんssh
。たとえば、を使用してリモートホストで「help」コマンドを実行しようとしてssh 192.168.32.1 help
も、何も起こりません。試してみたところssh -v 192.168.32.1 help
、結果は以下のようになりました。にこだわるdebug1: Sending command: help
。
OpenSSH_4.3p2, OpenSSL 0.9.8b 04 May 2006
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to 192.168.32.1 [192.168.32.1] port 22.
debug1: Connection established.
debug1: permanently_set_uid: 0/0
debug1: identity file /root/.ssh/identity type -1
debug1: identity file /root/.ssh/id_rsa type 1
debug1: identity file /root/.ssh/id_dsa type -1
debug1: loaded 3 keys
debug1: Remote protocol version 1.99, remote software version OpenSSH_4.3
debug1: match: OpenSSH_4.3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_4.3
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-cbc hmac-md5 none
debug1: kex: client->server aes128-cbc hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host '192.168.32.1' is known and matches the RSA host key.
debug1: Found key in /root/.ssh/known_hosts:5
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Next authentication method: publickey
debug1: Trying private key: /root/.ssh/identity
debug1: Offering public key: /root/.ssh/id_rsa
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Trying private key: /root/.ssh/id_dsa
debug1: Next authentication method: keyboard-interactive
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Next authentication method: password
[email protected]'s password:
debug1: Authentication succeeded (password).
debug1: channel 0: new [client-session]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
debug1: Sending command: help
その結果、を使用scp -v devel/bin/i2c [email protected]:/mnt/n1/
してファイルをリモートホストにコピーできず、次の行にとどまります。
debug1: Sending command: scp -v -t /mnt/n1/
たくさん検索しましたが、答えが出ませんでした。どんな助けでもいただければ幸いです。
シェルを呼び出してコマンドを実行させる標準的な方法の1つは、コマンドラインパラメーター-c
と実行するコマンドを使用してシェルプログラムを呼び出すことです。これは、OpenSSHSSHサーバーがクライアントから要求されたコマンドを呼び出すために使用する方法です。
SSHクライアントがOpenSSHサーバーに接続し、サーバーでコマンドの実行を要求すると、サーバーは次と同等の機能を呼び出すことになります。
$SHELL -c 'the-command'
ここ$SHELL
で、はユーザーのデフォルトシェル、-c
はリテラルコマンドラインオプション、the-command
はクライアントから要求されたコマンドです。コマンドは、単一のコマンドライン引数としてシェルに渡されます。
あなたの場合、シェルはカスタムシェルプログラムになります。「-c」とコマンド文字列を使用して実行されたという事実を取得するには、コマンドラインパラメータを解析する必要があります。次に、入力ストリームからコマンドを読み取る代わりに、コマンドラインで指定されたコマンドを実行する必要があります。
他のCプログラムと同様に、シェルプログラムへのエントリポイントは次のように呼ばれる関数main
です。
int main(int argc, char **argv)
{
...
あなたのシェルはこのやり方でSSHサーバから呼び出されたとき、あなたはそれを見つける必要がありますargc
し、argv
コマンドライン引数を反映します["/name/of-shell", "-c", "the-command"]
。getopt(3)
コマンドライン引数の解析に役立つように呼び出すことができるような標準関数があります。
scp
サーバーにシェルを介してプログラムを呼び出させることで機能することを追加します。したがって-c
、scpセッション用に(実行するパラメーターとコマンドを使用して)カスタムシェルが呼び出されていることがわかります。サーバーの構成方法によっては、sftpセッションでもこれが表示される場合があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加