ユーザーのデフォルトのシェルが何であるかに関係なく、SSHがリモートエンドで特定のシェルを使用するように強制する方法はありますか?
私は次のような解決策を試しました:
ssh Host.domain.com /bin/bash -c 'complicated, multi-line command'
残念ながら、リモートエンドのデフォルトシェルは「複雑な複数行コマンド」部分の解析を担当しており、BashとCシェルの両方のユーザーが機能するように十分にエスケープするのが困難です。
少なくともopensshベースのシステムでは、これが可能であるとは思いません。可能であれば、より良い解決策は、Shellスクリプトファイルをsftpでアップロードし、投稿したメソッドで実行することです。必要なエスケープの量を最小限に抑えるという利点がありますが、削除する必要があるファイルを残します(おそらくスクリプトの最後のステップとして)。
ヒアドキュメントを使う:
ssh Host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF
パスワードベースではなく、キーベースのログインを使用します。次に、(リスト)「強制コマンド」を公開sshキーに追加できます(「オプション」 )サーバーにインストールされているSSH1の場合のフィールド)〜/ .ssh/authorized_keysファイル(SSH1の場合)〜/ .ssh2/authorization SSH2の場合)。
必要なシェルが呼び出されるように強制コマンドを作成します...
続き:与えられたキーに最大1つの強制コマンドを関連付けることができます。異なる目的で複数の強制コマンドが必要な場合は、異なるキーを設定する必要があります。 (もちろん、強制コマンドを介して呼び出す1つのスクリプトに複数のものを入れることができます。ただし、強制コマンドは常にユーザーが別の実行を要求したかどうかに関係なく、ユーザーがログインすると、指定されたアカウント/キーに対して実行します。要求された元のコマンドを引き続き尊重したい場合は、 $SSH_ORIGINAL_COMMAND
変数...)
「強制コマンド」Google経由について読んでください。
-t
オプションを使用すると、標準のシェルを実行しているかのように、起動するプログラムに疑似ttyを強制的に割り当てることができます。次に、必要なシェルを単純な古い引数として渡します。
この手法を使用すると、インストールされているシェルを使用できるだけでなく、単一のコマンドからvimおよびTTYを必要とするその他のプログラムを開くこともできます。どこかにログインしてvimやhtopなどでファイルを開くシェルスクリプトを作成している場合、これはすばらしい方法です。
こちらがbash
です
me@my-machine $ ssh root@myhost -t bash
root@myhost:~#
sh
も機能します。他の何でも本当にそうです。
me@my-machine $ ssh root@myhost -t sh
#
これがログインシェルであるかどうかはわかりませんが、bashをログインシェルのように動作させるオプションがあるため、シェルにもそれがある可能性があります。
驚いたことに、次のようなさまざまな結果が得られました。
ダッシュで実行:
ssh [email protected] /bin/bash -c "echo <(cat)"
sh: 1: Syntax error: "(" unexpected
対bash:
ssh [email protected] '/bin/bash -c "echo <(cat)"'
/dev/fd/63
完全に引用されたコマンドの表示は期待どおりに機能しています。
しばらく前に同様の状況に直面しましたが、sqlplusにksh coprocessを使用する必要があり、読み取りと書き込みを実行する必要があるのは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")