Bash 如何在伪tty分配期间使用特定shell?
我希望能够在bash中执行远程命令,而不是在远程机器上执行默认的zsh(最好不用修改远程机器上的设置) 例如:Bash 如何在伪tty分配期间使用特定shell?,bash,shell,ssh,Bash,Shell,Ssh,我希望能够在bash中执行远程命令,而不是在远程机器上执行默认的zsh(最好不用修改远程机器上的设置) 例如: ssh -t -t some-command-that-only-works-in-bash-to-execute-remotely 您可以这样做: ssh user@host "bash -c \"some-command-that-only-works-in-bash-to-execute-remotely\"" echo "some-command-that-only-wor
ssh -t -t some-command-that-only-works-in-bash-to-execute-remotely
您可以这样做:
ssh user@host "bash -c \"some-command-that-only-works-in-bash-to-execute-remotely\""
echo "some-command-that-only-works-in-bash" | ssh user@host bash
ssh user@host bash < <(echo "some-command-that-only-works-in-bash")
然而,请小心引用。ssh
命令的参数将首先进行本地扩展和分词,然后传递到ssh
,然后提交到远程shell并进行第二轮(远程)扩展和分词
例如,这将回显LOGNAME
的本地值:
ssh user@host "bash -c \"echo $LOGNAME\""
ssh user@host "bash -c \"echo \$LOGNAME\""
ssh user@host 'bash -c "echo $LOGNAME"'
这将回显LOGNAME
的远程值:
ssh user@host "bash -c \"echo $LOGNAME\""
ssh user@host "bash -c \"echo \$LOGNAME\""
ssh user@host 'bash -c "echo $LOGNAME"'
如果您想了解原因,请尝试将ssh
替换为echo
,然后查看远程端将接收到什么命令
您也可以这样做:
ssh user@host "bash -c \"some-command-that-only-works-in-bash-to-execute-remotely\""
echo "some-command-that-only-works-in-bash" | ssh user@host bash
ssh user@host bash < <(echo "some-command-that-only-works-in-bash")
echo“一些只在bash中工作的命令”| sshuser@host猛击
sshuser@hostbash<如前面的评论中所述,这里的文档可以这样使用:
me@mycomp ~ $ ssh me@127.0.0.1 "/bin/sh <<%
echo 'user\np@55word!' > ~/cf1
%"
me@127.0.0.1's password:
me@mycomp ~ $ cat ~/cf1
user
p@55word!
me@mycomp~$sshme@127.0.0.1“/bin/sh描述如何小心引用会很有帮助。对于ssh的用户来说,这可能并不明显user@hostbash-c“printf'%s\n'\”\$@\“第一个参数”“第二个参数”“
将放弃仔细提供的报价,相当于远程运行bash-c printf'%s\n'\uufirst arg second arg
而不是远程运行printf'%s\n''first arg''second arg'
(基本上,ssh运行sh-c”$*”
在远程端,将所有单独的参数混合在一起,因此ssh-host bash-c“在bash中工作的某个命令”
示例是完全错误的——首先只传递一个字符串,然后:ssh-host“bash-c”只在bash中工作的某个命令,这样就不容易混淆了例如,
,将按预期运行)。@CharlesDuffy你会说管道命令而不是使用-c
可能需要更多的代码,但更容易理解到底是什么让它到达了另一端?如果可能的话,我肯定是stdin管道脚本的粉丝。(顺便说一句,作为实现这一点的一种手段,一个heredoc可能比一个过程替换要传统一点)。@CharlesDuffy我不太使用heredocs,因为我所做的大部分是动态生成的,而不是静态生成的(或者只使用简单的变量替换),所以我所举的例子中往往会显示这一点);我通常会有一个函数来生成脚本,并通过进程替换将其输出管道化到ssh
。。请看——您将看到它都在C中。@CharlesDuffy OpenSSH服务器使用用户的登录shell来执行命令。如果用户的登录shell为空,则默认为/bin/sh,这是解释该字段中空白值的正常方式。请参见中的do\u child()
。@Kenster--我已更正。(也就是说,问题的“在伪tty分配期间”这一部分表面上仍然毫无意义)。我建议在本地shell而不是远程shell中形成HEDEOC——否则,HEDEOC是由显式/bin/sh
之前启动的远程shell创建的,而不是由/bin/sh
本身或(可能已知/理解)本地shell。(可能还想引用它: