粘贴到 ssh 终端时,bash heredoc 被损坏(随机)[重复]

Posted

技术标签:

【中文标题】粘贴到 ssh 终端时,bash heredoc 被损坏(随机)[重复]【英文标题】:bash heredoc gets corrupted(randomly) when pasted to ssh terminal [duplicate] 【发布时间】:2018-07-09 04:57:01 【问题描述】:

我使用 ssh 连接到许多 Linux 服务器并在每个服务器上运行健康检查脚本,这样做时希望为每台服务器节省 2 秒。 所以不是通常创建脚本文件:

cat > test.sh
+
right-click paste(whole script file -copied from notepad)
+
ctrl+c

我右键粘贴:这里有整个脚本的文档(复制形式记事本):

cat <<'EOF' > test.sh
#!/bin/bash
commands..
commands..
EOF

这样粘贴时,大约 50% 次的脚本内部会损坏。 随机行/行上发生损坏(缺少部分行,缺少某些字符等),导致脚本运行时出现语法错误,其他 50% 次脚本粘贴正常,可以正常运行。

问题绝对不在脚本本身。 当它以 cat > filename 方式复制时,它可以 100% 工作。 从中复制文本的记事本使用 UNIX - LF EOL conv。但这也发生在切换到 windows CRLF 类型时。 脚本内部没有制表符,只有空格,limitString 本身之前没有前导空格

脚本有 430 行长,这可能是个问题吗? 我在其他一些 bash 脚本中或直接在终端中使用相同的语法有一段时间了,但从未遇到过这种行为。

有人知道可能是什么原因造成的吗?或者可能的解决方法?

【问题讨论】:

想不出是什么原因造成的,但是有什么理由不将heredoc 作为初始ssh 命令的一部分而不是将其粘贴到远程计算机上? ssh user@machine &lt;&lt; 'EOF' ... EOF 其实远程机器运行的是什么内核? lists.gnu.org/archive/html/bug-readline/2013-07/msg00006.html 可能相关 主要是 RHEL7 和 RHEL6(不同的版本)这个 bug 听起来很相似。将heredoc作为初始ssh的一部分可能会解决这个问题。没有理由阻止这种方法。一旦我使用初始 ssh 进行一些测试,我将更新。 这是一个 *** 问题?复制和粘贴在您的终端中无法正常工作的问题是最终用户错误,适用于 Unix & Linux 或 SuperUser。如果您是编写终端的人,这将是一个适合 SO 的开发问题,但如果您是使用它的人,则不是。 ...也就是说,如果这是您的目标,肯定有更好的方法可以将文件复制到远程服务器(也许您应该问这个问题,而不是临时尝试提出的问题)。 【参考方案1】:

按照here的建议尝试

ssh remoteuser@ip.address.of.server 'bash -s' < scriptfile.sh

【讨论】:

如果这解决了 OP 的预期问题,则该问题应作为 How to use ssh to run a shell script on a remote machine? 的副本关闭 感谢您的建议,我将使用一些不同的方法来解决我的问题。是的,我认为这可以作为重复关闭。

以上是关于粘贴到 ssh 终端时,bash heredoc 被损坏(随机)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

SSH heredoc:bash 提示符

粘贴到 SSH 终端大写最后一个字符,不允许我编辑它

Bash 引用换行符导致heredoc 消耗第一个换行符

如何将多行 bash 代码粘贴到终端并一次运行?

当超过 512 个字符时,bash heredoc 挂起

如何粘贴到终端?