CentOS 7.x中enter命令输出为什么是M

Dol*_*hin 4 linux

今天当我使用这个命令在我的 CentOS 7.x 中生成一个 rsa 密钥时,当我使用回车确认我的命令时,但输出是^M,发生了什么?

[root@izbp19pke6x0v6ruecuy1yz ~]# ssh-keygen -t rsa -b 4096 -C jiangtingqiang@gmail.com
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 jiangtingqiang@gmail.com
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 jiangtingqiang@gmail.com
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): ^M^M^M^M^C
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,我应该怎么做才能解决它?这是 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
Run Code Online (Sandbox Code Playgroud)

我以前从未遇到过这个问题。现在我对这个问题一无所知。欢迎提出任何想法,兄弟...顺便说一下,我的本地操作系统是 Mac OS Catalina,我使用的是 zsh,终端工具是 iTerm。

Kam*_*ski 10

终端在 上发送CR( ^M)是正常的Enter。他们不必发送LF( ^J)。在我的 Debian 中,Kubuntu,在其他几个 Linux 系统Ctrl+ 中vEnter显示^M. 我会说^M(not ^J) 是来自终端的行尾的正确(或至少是common)字符。

一些 shell 接受^M^J来运行输入的命令。Bash 可以,Zsh 可以。

显然ssh-keygen需要^J并且可以,因为它应该期望并获得^J. 琐事:当ssh-keygen或几乎任何东西)运行时,终端不处于原始模式,程序在^J到来之前什么也得不到。

在不更改任何设置的情况下,您可以^J通过键入Ctrl+来“手动”生成j。如果您使用此组合而不是Enter同时提供输入,ssh-keygen那么它将起作用。

在我的系统(如Enter发送^Mssh-keygen的作品,因为每个系统各自的终端驱动程序转换^M^J的飞行。终端驱动程序在icrnl设置时执行此操作。这是很正常的一个发送端^MEnter,它转化为一个终端驱动程序^J在其末端。

您的终端显然发送,^M但在stty -a那里的输出中,-icrnl这意味着有问题的终端驱动程序不会转换^M^J.

无论是配置终端(iterm,腻子,konsole或其他)发送^JEnter,或使用

stty icrnl
Run Code Online (Sandbox Code Playgroud)

使终端驱动程序转换^M^J预期ssh-keygen