如何以编程方式将文件末尾字符发送到 ssh 连接

How do I send the end of file character to an ssh connection programmatically

提问人:Jason Eveleth 提问时间:10/28/2022 更新时间:10/28/2022 访问量:355

问:

我想模拟这个 shell 会话:

$ ssh remotehost
[remote] $ cat > /tmp/test.txt
testing
newline
^D[remote] $ echo another cmd
another cmd
[remote] $ ^D

这将创建一个内容为“testing\nnewline\n”的新文件,然后运行另一个命令并终止 SSH 会话。/tmp/test.txt

我知道 EOT(传输结束字符)的 ascii 值是 。所以我想我可以通过运行以下命令来模拟这一点:0x04

$ echo "cat > /tmp/test.txt\ntesting\nnewline\n\x04echo another command\n" | ssh -tt remotehost

这似乎有效,因为它可以正确发送命令,但是当文件字符的末尾应该结束 cat 命令时,它会卡住。我做错了什么?

bash ssh eof

评论

1赞 dave_thompson_085 10/28/2022
默认情况下,内置的 bash 不执行反斜杠转义,您必须指定 .一般来说,它更坚固,更便携。但即使解决了这个问题,发送任何控制字符对我来说也失败了,例如 发送一个明确包含选项卡的命令行,但回显并执行它而不带选项卡。请注意,您的会话可以改用 heredoc,并且它确实可以通过 ssh 工作。echo-eprintfprintf 'xxd<<<"a\x09b"\n' | ssh -tt ...command <<XYZ \n blah \n XYZ \n

答:

0赞 Jason Eveleth 10/28/2022 #1

谢谢你@dave_tompson_085。您的评论使我意识到我应该检查时间并使用 printf。以下命令有效:

(printf 'cat > /tmp/test.txt\n'; 
 sleep 2; 
 printf 'testing\nnewline\n\x04'; 
 sleep 1; 
 printf 'echo another command\n\x04') | ssh -tt ...

另一种解决方案是在调用命令时使用 here 文档。cat