ユーザーのデフォルトのシェルが何であるかに関係なく、リモートエンドで特定のシェルを使用するようにSSHを強制する方法はありますか?
私は次のようなソリューションを試しました:
ssh host.domain.com /bin/bash -c 'complicated, multi-line command'
残念ながら、リモートエンドのデフォルトシェルは「複雑な複数行コマンド」部分の解析を担当し、BashとCシェルユーザーの両方で機能するように十分にエスケープすることが困難です。
ユーザーのデフォルトのシェルが何であるかに関係なく、リモートエンドで特定のシェルを使用するようにSSHを強制する方法はありますか?
私は次のようなソリューションを試しました:
ssh host.domain.com /bin/bash -c 'complicated, multi-line command'
残念ながら、リモートエンドのデフォルトシェルは「複雑な複数行コマンド」部分の解析を担当し、BashとCシェルユーザーの両方で機能するように十分にエスケープすることが困難です。
回答:
少なくともopensshベースのシステムでは、これが可能だとは思わない。能力がある場合、より良い解決策は、シェルスクリプトファイルをsftpで送信し、投稿したメソッドで実行することです。必要なエスケープの量を最小限に抑えるという利点がありますが、削除する必要があるファイルを残します(おそらくスクリプトの最後のステップとして)。
ヒアドキュメントを使用します。
ssh host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF
cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash
。したがって、1つのステップの代わりに2つのステップがあります。ステップ1はスクリプトをファイルにコピーし、ステップ2 cat
はスクリプトをにコピーしますssh
。
パスワードベースではなく、キーベースのログインを使用します。次に、サーバーにインストールされている(SSH1の〜/ .ssh / authorized_keysファイルに)「強制コマンド」を(ssh1の場合は「options」フィールドに)公開sshキーに追加できます。、〜/ .ssh2 / SSH2の承認)。
目的のシェルが呼び出されるように強制コマンドを作成します...
詳細:指定されたキーには、最大1つの強制コマンドを関連付けることができます。異なる目的で複数の強制コマンドが必要な場合は、異なるキーを設定する必要があります。(もちろん、強制コマンドを介して呼び出す1つのスクリプトに複数のものを入れることができます。ただし、ユーザーがログインすると、異なるコマンドを実行するように要求したかどうかに関係なく、特定のアカウント/キーに対して強制コマンドが常に実行されることに注意してください。要求された元のコマンドを引き続き尊重する場合は、$SSH_ORIGINAL_COMMAND
変数を悪用する方法を調べてください...)
/etc/sshrc
。
この-t
オプションを使用すると、標準シェルを実行しているかのように、起動するプログラムに擬似ttyを強制的に割り当てることができます。次に、必要なシェルを単純な古い引数として渡します。
この手法を使用すると、インストールされているシェルを使用できるだけでなく、vimやTTYを必要とする他のプログラムを単一のコマンドから開くこともできます。どこかにログインしてvim、htopなどでファイルを開くシェルスクリプトを書いているなら、これは素晴らしいことです。
me@my-machine $ ssh root@myhost -t bash
root@myhost:~# exit
Connection to myhost closed.
me@my-machine $ ssh root@myhost -t sh
# exit
Connection to myhost closed.
me@my-machine $
これがログインシェルであるかどうかはわかりませんが、bashをログインシェルのように動作させるオプションがあるため、シェルにもそれがあるかもしれません。
驚くべきことに、私は次のことで異なる結果を見ます:
ダッシュで実行:
ssh eric@172.17.1.241 /bin/bash -c "echo <(cat)"
sh: 1: Syntax error: "(" unexpected
vs bash:
ssh eric@172.17.1.241 '/bin/bash -c "echo <(cat)"'
/dev/fd/63
完全に引用されたコマンドを表示すると、期待どおりに機能します。
sh -c "$*"
ます。したがって、実行していsh -c "/bin/bash -c echo <(cat)"
ます。echo
コマンド自体はに渡される唯一の引数で-c
あり、<(cat)
完全に独立した引数です。
sqlplusでkshコプロセスを使用する必要があり、読み取りと書き込みを実行する必要があるsshしかなかったという状況にしばらく直面しました。
これを行う方法は、すべての依存コマンドを1行にパイプし(;を使用)、リモートマシンの/ usr / bin / kshに接続することです。例えば:
host="user@host"
db_conn="ora_user/passwd"
a="select * from dual;"
frmt="set heading off echo off feedback off verify off pagesize 0 termout off"
var=$(ssh ${host} "echo 'sqlplus -silent /nolog |&; sql_pid=\$!; print -p \"conn ${db_conn}\"; print -p \"${frmt}\"; print -p \"${a}\"; print -p \"exit\"; wait \$sql_pid' > /remote_dir/kshcmd.txt; awk '{print \$0}' /remote_dir/kshcmd.txt | /usr/bin/ksh")