今天,当我在我的 CentOS 7.x 中使用此命令生成 rsa 密钥时,当我使用 Enter 确认我的命令时,但输出是^M
,发生了什么?
[root@izbp19pke6x0v6ruecuy1yz ~]# ssh-keygen -t rsa -b 4096 -C [email protected]
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): ^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^C
[root@izbp19pke6x0v6ruecuy1yz ~]# ssh-keygen -t rsa -b 4096 -C [email protected]
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): github-actions^C
[root@izbp19pke6x0v6ruecuy1yz ~]# ssh-keygen -t rsa -b 4096 -C [email protected]
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): ^M^M^M^M^C
为什么会发生这种情况?我应该怎么做才能解决它?这是 tty 配置:
[root@izbp19pke6x0v6ruecuy1yz ~]# stty -a
speed 38400 baud; rows 37; columns 210; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = M-^?; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
我以前从未遇到过这个问题。现在我对这个问题一无所知。任何想法都欢迎兄弟...,顺便说一句,我的本地操作系统是 Mac OS Catalina,我正在使用 zsh,终端工具是 iTerm。
答案1
终端在 时发送CR
( ^M
)是正常的Enter。它们不必发送LF
( ^J
)。在我的 Debian、Kubuntu 和其他一些 Linux 系统Ctrl+中v,Enter显示^M
。我会说^M
(不^J
) 是正确的(或者至少常见的) 字符作为来自终端的行结束符。
有些 shell 接受^M
和^J
来运行输入的命令。Bash 和 Zsh 都接受。
显然ssh-keygen
需要^J
,而且没问题,因为它应该期望并得到^J
。琐事:当ssh-keygen
(或几乎任何东西)运行时,终端不在原始模式并且程序直到^J
到达时才得到任何结果。
无需更改任何设置,您可以通过键入+^J
来“手动”生成。如果您使用此组合而不是同时提供输入,那么它将起作用。CtrljEnterssh-keygen
在我的系统中(Enter发送^M
)ssh-keygen
之所以有效,是因为每个系统中的相应终端驱动程序都会即时转换^M
为。当设置 时,终端驱动程序会执行此操作。通常有一个发送 的终端和一个在其一端将其转换为 的终端驱动程序。^J
icrnl
^M
Enter^J
您的终端显然发送了,^M
但在输出中stty -a
有,-icrnl
这意味着有问题的终端驱动程序无法转换^M
为^J
。
配置您的终端(iterm
,PuTTYkonsole
或其他)以发送^J
,Enter或者使用
stty icrnl
使终端驱动程序翻译^M
成^J
预期的ssh-keygen
。
答案2
不是一个解决方案,但是^M
(Ctrl+ M)字符是插入符号表示法为不可打印字符回车符 ( CR
),如本超级用户问题。
通常,在基于 Unix 的系统(如 Linux)中,换行符 ( LF
) 用作换行符。如果我没有看错您的 TTY 配置,则似乎CR
发送的是 而不是LF
。因此,屏幕终端打印插入符号而不是将其识别为正确的行尾或其他内容似乎是合理的。
至于“为什么”会发生这种情况,我相信CR
过去在 MacOS 上它被用作换行符,但是当前版本的 MacOS 不再使用它(LF
据我所知,他们已经切换到它了)。
假设这是问题所在,我的想法可能是研究改变你的TTY配置来发送“正确”的字符LF
(^J
基于此维基百科图表) 代替CR
。