Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在伪tty分配期间使用特定shell?_Bash_Shell_Ssh - Fatal编程技术网

Bash 如何在伪tty分配期间使用特定shell?

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

我希望能够在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-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。(可能还想引用它: