AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 433838
Accepted
Gohu
Gohu
Asked: 2018-03-28 05:14:37 +0800 CST2018-03-28 05:14:37 +0800 CST 2018-03-28 05:14:37 +0800 CST

将多个命令粘贴到终端时,Bash 命令会被截断

  • 772

我将以下 100 行复制/粘贴到我的终端(xterm)中,以在我连接到的服务器上执行那些ssh:

mv /long/path/to/file1 /longer/path/to/file1
mv /long/path/to/file2 /longer/path/to/file2
...
mv /long/path/to/file99 /longer/path/to/file99
mv /long/path/to/file100 /longer/path/to/file100

不幸的是,在复制/粘贴之后,我在下面找不到我的 100 个文件/longer/path/to/

查看我通过 ssh 连接到的服务器上的 bash 历史记录,我可以看到在前 20 个命令之后,大多数命令都被截断了:

mv /long/path/to/file1 /longer/path/to/file1
...
mv /long/path/to/file20 /longer/path/to/file20
mv /long/path/to/fi
mv /long/path/to/fi
mv /long/path/to/file23 /longer/p
mv /long/path/to/file24 /longer/path
mv /long/path/to/file25 /longer/p
mv /long/path/to/file26 /longer/p
mv /long/path/to/file27 /longer/path/t
mv /long/path/to/file28 /longer/path/to/fil
mv /long/path/to/file29 /longer/path/to/fil
mv /long/path/to/file30 /longer/path/to/file
mv /long/path/to/file31 /longer/path/to/file
...

我可以找到有关如何解决此问题的答案:

  • 如何粘贴多个 Bash 命令而不丢失一些
  • 粘贴到终端的命令被截断

但我找不到关于到底发生了什么的解释。尤其:

  • 这是与终端相关的问题(在我的情况下为 Xterm)?
  • 复制/粘贴发生在ssh:这是否会产生或放大问题?
  • 这是服务器上与 bash 相关的问题吗?另一个外壳可能不会发生吗?
shell ssh
  • 3 3 个回答
  • 3446 Views

3 个回答

  • Voted
  1. Best Answer
    gena2x
    2018-06-26T02:18:47+08:002018-06-26T02:18:47+08:00

    似乎你遇到了这个错误:

    https://lkml.org/lkml/2013/7/25/205

    当大于 4k 的粘贴超出行规则缓冲区时,readline() 会无意中触发错误恢复路径。当行规则缓冲区已满并在规范模式下运行且未接收到换行时,错误恢复路径会丢弃输入。因为 readline() 将 termios 更改为非规范模式以逐个字符读取行,所以行规则缓冲区可能已满,然后当 readline() 将 termios 恢复为调用者的规范模式时,现在已满行规则缓冲区触发错误恢复。

    当将 termios 从非佳能模式更改为佳能模式并且读取缓冲区包含数据时,请在读取缓冲区中模拟没有DISABLED_CHAR 的 EOF 推送。

    重要的是对于 readline() 问题,termios 可以更改回非规范模式,而不会更改读取缓冲区;即,好像之前的 termios 更改没有发生(只要没有发生干预读取)。

    它于 2013 年 12 月 10 日应用于内核,即 linux 内核 3.14。你使用的是比这更老的 Linux 发行版吗?你的发行版是什么?您可能替换了文件的真实路径,所以我无法计算字符数。你能做到吗:

    for ((a=1; a<20; a++)); do echo "mv /long/path/to/file$a /longer/path/to/file$a"; done|wc -c
    

    用你的真实路径 - 它会真的接近 4k 吗?如果是这样,上面的错误可能是你的。

    如果是,请回答您的问题:

    • 这是与终端相关的问题(在我的情况下为 Xterm)?

    不

    • 复制/粘贴发生在 ssh 上:这会产生或放大问题吗?

    不

    • 这是服务器上与 bash 相关的问题吗?

    不,是 - 这不是 bash 或 bash 使用的任何库中的错误。错误在内核中。

    • 另一个外壳可能不会发生吗?

    可能是,如果 shell 没有使用 readline。像zsh。

    关于相关问题“如何粘贴多个...”似乎与您的问题无关 - 原因是某些应用程序可能会读取您粘贴的命令。最著名的例子是 ssh,如果你在远程服务器上运行 ssh 命令。但是鉴于您只丢失了部分线路,您的情况不太可能。

    第二个问题“粘贴到终端的命令...”于 2013 年 9 月 25 日问,当时补丁不存在,这绝对看起来像你有的错误,我怀疑我是内核的错误。

    如何确定?在此处粘贴 uname -a 的输出。

    • 3
  2. kemotep
    2018-06-20T06:38:47+08:002018-06-20T06:38:47+08:00

    手头的问题

    您想了解为什么复制和粘贴的代码行会被截断。

    我调查了您的问题,发现 Bash 默认情况下通常有行数限制。这很可能是您的问题。但是,您给出的示例显示行被截断的长度不同。我会尽力打破这个。

    解决方案

    1. 是否是终端相关问题(我的情况是 Xterm)?

    很可能是这样,但这是由于默认 Bash 环境而不是 xterm 的限制。(除非您更改了许多 xterm 的默认值)

    我正在参考以下帖子,这些帖子提供了增加行长以希望减少截断的解决方案。此 U&L 堆栈交换答案涵盖更改窗口大小以匹配终端仿真器的期望。用户saketrp 提供了这个解决方案,以确保您的终端正确解释您的窗口大小。

    如果你使用 bash,你可以试试这个。

    $ shopt checkwinsize
    

    如果你没有得到

    checkwinsize    on
    

    然后激活它

    $ shopt -s checkwinsize
    

    然后只需尝试运行另一个命令(如 ls)或调整窗口大小一次,以上每次都适用于我。

    特别是对于 Redhat 系统,该问题通常是由于错误配置 ~/.bashrc 以不调用 /etc/bashrc 引起的。通常,bash 会加载 ~/.bashrc,它会调用 /etc/bashrc,默认情况下会包含 shopt -s checkwinsize。

    但是,这只会影响对窗口大小的解释,而不影响实际的行长。如果您已正确设置,则使用此 AskUbuntu 帖子中提供的信息,shopt您可以添加以下行以.bashrc增加行长。

    COLUMNS=250
    

    并运行source .bashrc以更新您的 Bash 配置文件。

    2. 通过 ssh 进行复制/粘贴:这会产生或放大问题吗?

    我想说这是问题的一部分,如果不是根本原因的一部分。您链接的解决方法是防止这种情况发生的可靠解决方案。

    我建议如果您需要复制和粘贴一组命令(您需要多次使用它们吗?)创建一组命令的 Bash 脚本。然后使用scp, sftp, curl, 电子邮件或任何您想要使用的远程传输文件的方法。

    这完全避免了链接解决方法中概述的截断问题,您甚至可以编写脚本创建脚本和/或一次将脚本传输到多个服务器。

    3. 是服务器上bash相关的问题吗?另一个外壳可能不会发生吗?

    如前所述,是的,这可能是 Bash 配置文件设置设置的行限制的问题。其他shell可能没有这个问题,但我自己只熟悉Dash/Bash。但是,如果这些是生产服务器或遗留系统,如果您开始更改环境变量,它可能并不总是很好。并不是说这不是不可能的,但是如果某些软件包/软件/以前的脚本/cronjobs 依赖 Bash 作为默认 shell,则存在风险,更改它可能会产生后果。

    同样,我建议您创建一个您希望运行的命令的脚本并将其传输到远程服务器以在那里运行以解决此问题。

    结论

    为什么您的命令被截断取决于您的环境、Bash 配置文件设置、您的终端仿真器设置以及复制和粘贴命令的方法。正如您所指出的,有一些解决方法,我建议您将它们与脚本结合使用以避免该问题。我还包括一个联机帮助页的链接,xterm以便您查看是否有任何其他设置或选项可以更改。

    如果您对此答案有任何疑问或问题,请发表评论。我感谢反馈以纠正任何误解并改进我的帖子。我可以根据需要更新我的答案。

    祝你好运!

    • 1
  3. Alessandro Carini
    2018-06-20T08:05:06+08:002018-06-20T08:05:06+08:00

    我建议使用 gzip 和 base64 将命令从一个终端复制到另一个终端。如果问题来自元字符或制表符扩展,您应该以这种方式克服它。

    例子:

    [root@server-one ~]# cat << __EOF__ | gzip | base64
    mv /long/path/to/file23 /longer/p
    mv /long/path/to/file24 /longer/path
    mv /long/path/to/file25 /longer/p
    <other commands>
    __EOF__
    

    然后将编码结果复制到

    [root@server-two ~]$ base64 -di | gunzip | bash
    <insert your base64-encoded and send with control-d>
    
    • 0

相关问题

  • 这个命令是如何工作的?mkfifo /tmp/f; 猫/tmp/f | /bin/sh -i 2>&1 | 数控 -l 1234 > /tmp/f

  • FreeBSD 的 sh:列出函数

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • grep -v grep 有什么作用

  • 如何将带有〜的路径保存到变量中?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve