SSHに特定のシェルを使用させる


29

ユーザーのデフォルトのシェルが何であるかに関係なく、リモートエンドで特定のシェルを使用するようにSSHを強制する方法はありますか?

私は次のようなソリューションを試しました:

ssh host.domain.com /bin/bash -c 'complicated, multi-line command'

残念ながら、リモートエンドのデフォルトシェルは「複雑な複数行コマンド」部分の解析を担当し、BashとCシェルユーザーの両方で機能するように十分にエスケープすることが困難です。


回答:


8

少なくともopensshベースのシステムでは、これが可能だとは思わない。能力がある場合、より良い解決策は、シェルスクリプトファイルをsftpで送信し、投稿したメソッドで実行することです。必要なエスケープの量を最小限に抑えるという利点がありますが、削除する必要があるファイルを残します(おそらくスクリプトの最後のステップとして)。


1
これは最終的に私がやったことですが、scpを使用しています。素晴らしいアイデア。
-plinehan

16

ヒアドキュメントを使用します。

ssh host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF

bashに「-s」を使用してstdinからコマンドを読み取るべきではありませんか?
Weboide

常に必要なわけではありません。
イグナシオバスケス-エイブラムス

コマンドが標準入力にアクセスできず、質問が特定のシェルの呼び出しに関するものだったため、できればこれを投票します。
エリックウッドラフ14年

3
@EricWoodruff、...特定のシェル(この場合はbash)の呼び出しは、まさにこれがその方法を示していることです。
チャールズダフィー

1
参考までにできますcat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash。したがって、1つのステップの代わりに2つのステップがあります。ステップ1はスクリプトをファイルにコピーし、ステップ2 catはスクリプトをにコピーしますssh
トレバーボイドスミス

10

パスワードベースではなく、キーベースのログインを使用します。次に、サーバーにインストールされている(SSH1の〜/ .ssh / authorized_keysファイルに)「強制コマンド」を(ssh1の場合は「options」フィールドに)公開sshキーに追加できます。〜/ .ssh2 / SSH2の承認)。

目的のシェルが呼び出されるように強制コマンドを作成します...

詳細:指定されたキーには、最大1つの強制コマンドを関連付けることができます。異なる目的で複数の強制コマンドが必要な場合は、異なるキーを設定する必要があります。(もちろん、強制コマンドを介して呼び出す1つのスクリプトに複数のものを入れることができます。ただし、ユーザーがログインすると、異なるコマンドを実行するように要求したかどうかに関係なく、特定のアカウント/キーに対して強制コマンドが常に実行されることに注意してください。要求された元のコマンドを引き続き尊重する場合は、$SSH_ORIGINAL_COMMAND変数を悪用する方法を調べてください...)

Googleから「強制コマンド」について読んでください


いい物。O'Reillyページのグラフィックはとてもいいです。ただし、特定のケースでは、キーを正しくセットアップしたユーザーだけでなく、すべてのユーザーに対してこれを強制できるようにしたいと考えています。また、サーバーマシンにルートがないため、などのファイルを編集できません/etc/sshrc
プリネハン

さて、サービスに接続するときにショットを呼び出すのは、常にサーバー(または、サーバーを制御するサーバー)です。サーバーの「所有者」は、サーバーで何ができるかを決定します。-自分よりも高い特権を持っていない場合、「すべてのユーザー」に対して何も強制できません。
カートPfeifle

クライアントが任意のコマンドを実行できる場合、クライアントはコマンドとして任意のシェルも実行できます。
エリックウッドラフ14年

オライリーへのリンクが壊れている@KurtPfeifle
ブライアンヴァンデンバーグ

@BrianVandenberg:ヒントのThx。今、そのリンクを削除しました。
カートPfeifle

2

この-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をログインシェルのように動作させるオプションがあるため、シェルにもそれがあるかもしれません。


1

驚くべきことに、私は次のことで異なる結果を見ます:

ダッシュで実行:

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

完全に引用されたコマンドを表示すると、期待どおりに機能します。


1
まったく驚くことではありません。リモートsshデーモンが効果的に実行されsh -c "$*"ます。したがって、実行していsh -c "/bin/bash -c echo <(cat)"ます。echoコマンド自体はに渡される唯一の引数で-cあり、<(cat)完全に独立した引数です。
チャールズダフィー

0

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")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.