Answers:
我不相信这是不可能的,至少在基于opensh的系统上是不可能的。如果有能力,更好的解决方案可能是sftp一个shell脚本文件,然后使用您发布的方法执行它。这样做的好处是可以最大程度地减少所需的转义,但是会留下一个必须删除的文件(也许是脚本的最后一步)。
使用heredoc:
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 cat
将脚本复制到中ssh
。
使用基于密钥的登录名,而不是基于密码的登录名。然后,您可以将(强制列表)(强制列表)添加到安装在服务器上的SSH1 公用密钥(在SSH1情况下,在“选项”字段中)(在SSH1的〜/ .ssh / authorized_keys文件中) ,〜/ .ssh2 / SSH2 授权)。
进行强制命令,以便调用所需的shell ...
更多:您最多可以将一个强制命令与给定键关联。如果出于不同目的需要多个强制命令,则必须设置不同的键。(当然,您可以将多个内容放到一个脚本中,通过强制命令调用。但是要注意,如果用户登录,则强制命令始终针对给定的帐户/密钥运行,无论用户是否要求运行其他命令。如果您仍要遵守要求的原始命令,请查看如何利用该$SSH_ORIGINAL_COMMAND
变量...)
通过Google阅读有关“强制命令”的信息。
/etc/sshrc
。
您可以使用该-t
选项为要启动的程序强制分配伪tty,就像执行标准Shell一样。然后将您想要的外壳作为普通的旧参数传递。
使用这种技术,您不仅可以使用已安装的任何shell,还可以通过一个命令打开vim和其他需要TTY的程序。如果您正在编写将您登录到某个地方并在vim或htop或其他文件上打开文件的shell脚本,那么这很酷。
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 $
不确定这是否是登录shell,但是是否存在使bash像登录shell一样的选项,因此您的shell也可能具有该功能。
令人惊讶的是,我看到以下结果:
在破折号中运行:
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,必须通过该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")