强制SSH使用特定的shell

有没有办法强制SSH在远程端使用特定的shell,而不pipe用户的默认shell是什么?

我试过的解决scheme类似于:

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

但不幸的是,远程端的默认shell负责parsing“复杂的,多行的命令”部分,而且我很难逃脱它,以便为Bash和C shell用户使用。

我不相信这是可能的,至less在openssh的系统。 如果你有能力,更好的解决scheme可能是把一个shell脚本文件搞定,然后用你发布的方法来执行它。 这样做的好处是可以尽量减less所需的转义数量,但是会留下一个文件,这个文件将不得不被删除(也许作为脚本的最后一步)。

使用heredoc:

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

使用基于密钥的login,而不是基于密码。 然后,您可以在服务器上安装(SSH1的〜/ .ssh / authorized_keys文件中),将一个( 强制命令列表)添加到公共ssh密钥(在SSH1的“选项”字段中) , 〜/ .ssh2 / SSH2 授权 )。

使你的强制命令,以便所需的shell被称为…

更多:您最多可以将一个强制命令与给定的键相关联。 如果您为了不同的目的需要多个强制命令,则必须设置不同的密钥。 (当然,你可以把多个东西放在一个脚本中,你可以通过强制命令来调用,但是要注意,如果用户login,强制命令总是运行给定的帐户/密钥,而不pipe他是否要求不同的东西运行。如果你仍然想要遵守原来的命令,看看如何利用$SSH_ORIGINAL_COMMANDvariables…)

阅读关于通过谷歌 “强制命令”。

令人惊讶的是我看到以下不同的结果:

运行在短跑:

 ssh [email protected] /bin/bash -c "echo <(cat)" sh: 1: Syntax error: "(" unexpected 

vs bash:

 ssh [email protected] '/bin/bash -c "echo <(cat)"' /dev/fd/63 

显示完全引用的命令正在按预期工作。

我曾经遇到类似的情况,我需要使用ksh coprocess for sqlplus,而且我只有一个ssh,通过它读取和写入必须发生。

一种方法是将远程计算机上的所有相关命令放入一行(使用;)到/ 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")