该问题出现在内核 6.12.18、6.12.17 和 6.12.16 中。
操作系统启动后,系统提示我登录 tty。我输入用户名并按 Enter。当我尝试输入密码时,当我输入第一个字母时,系统会立即输入换行符。有时是第二个字母。这导致无法登录系统。我检查了类似的问题,他们说更新或较旧的内核应该可以解决这个问题,但都没有用。
该问题出现在内核 6.12.18、6.12.17 和 6.12.16 中。
操作系统启动后,系统提示我登录 tty。我输入用户名并按 Enter。当我尝试输入密码时,当我输入第一个字母时,系统会立即输入换行符。有时是第二个字母。这导致无法登录系统。我检查了类似的问题,他们说更新或较旧的内核应该可以解决这个问题,但都没有用。
最近我需要将tty
系统上 (非 ttyS*) 的最大数量从63增加到128。但查看 Linux 源代码时,我发现该文件include/uapi/linux/linux/vt.h
包含
#define MIN_RN_CONSOLES 1 /* must be at least 1 */
#define MAX_RN_CONSOLES 63 /* serial lines start at 64 */
最后显示串行线从 64 开始
我检查了一下:
$ stat -c %Hr:%Lr /dev/tty63
4:63
$ stat -c %Hr:%Lr /dev/ttyS0
4:64
确实从64开始
我尝试在包含文件中找到类似的行(如MIN_SERIAL_CONSOLES
),但找不到。
我怎样才能使次要编号/dev/ttyS0
以 开头,129
以便其他 128 个属于/dev/tty1
... tty128
?
我正在尝试测试以下环境:
一台服务器(它是一个路由器,它有 busybox 和其他一些 cmd),带有一个物理串行端口和一个开放套接字
#tcpsvd -v 0.0.0.0 -p 999 cat /dev/ttyS0
多个客户端连接到服务器
我的问题:1 当我向 ttyS0 写入新行数据时,每次随机仅向一个客户端发送新行数据,我希望同时向所有客户端发送。2 我可以使用什么代替 cat 进行双向通信?3 我如何才能使流按字节而不是按行发送?
谢谢!
finger
我正在尝试在 Linux Mint 中用 C创建自己的命令。研究真正的finger
命令我了解到,使用短输出格式时命令在 tty 中放置的星号是当用户之一禁用写入权限时,我认为用于在 tty 之间发送和接收消息的权限,即可以通过命令启用 mesg y
。
我的问题是,finger
从哪里获取tty的写权限信息?我尝试查看 utmp 文件,但找不到相关的内容:(
另外,如果我禁用与 GUI 连接的 tty 的写入权限,为什么该finger
命令会将星号放在 pts/0 条目上,而不是我的 tty 附近?
喜欢
matteo tty7 2:40 Apr 29 16:10 (:0)
matteo *pts/0 Apr 29 17:20
提前致谢,如果我写错了,抱歉,这是我第一次深入了解 Linux :)
我正在尝试设置 getty 通过串行登录(主要作为实验)。
几乎任何配置都会发生同样的事情。如果我的默认 shell 是bash
,我在登录后会收到以下消息:
-bash: cannot set terminal process group (15297): Inappropriate ioctl for device
-bash: no job control in this shell
然后为了证明它不起作用,我不能使用ctrl+C来停止程序:
$ sleep 30
^C
而且似乎没有发出信号。
这些是我尝试过的配置:
我已经尝试过这两个命令
# copied from raspberry pi:
sudo /sbin/agetty --keep-baud 115200,38400,9600 ttyUSB0 vt220
# something else I read somewhere
sudo getty -L ttyUSB0 9600 vt100
# (I know I'm mixing and matching a lot of differences but the result is the same)
我作为客户端尝试过 screen 和 picocom。
我尝试过使用 rasberry pi 作为服务器,以及两台不同的 ubuntu 笔记本电脑。
我尝试过两个 FTDI、两个 RS-485 USB 适配器,以及 getty 端的内置 RS232 和客户端的 USB RS232。
我还尝试将默认 shell 更改为 sh 和 dash。我没有收到消息,但 ctrl+C 仍然无法按预期工作
有趣的是 - 当树莓派自动配置/dev/ttyAMA0
,并且它完全使用我放置的 getty 命令时,作业控制起作用了!
并且终端设置几乎相同。(实际上除了-iutf8)
以下是 FTDI 连接和 picocom 运行的终端设置:
$ stty -a -F /dev/ttyUSB0
speed 9600 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D;
eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = <undef>; discard = <undef>; 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 -flusho -extproc
$ stty -a -F /dev/ttyUSB1
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D;
eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
discard = ^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 -flusho -extproc
我究竟做错了什么?为什么它可以与树莓派上内置串口的内置配置一起使用?
我在 PI 上运行 Armbian,并通过串行 USB TTL 适配器对其进行操作。
我正在运行以下命令来连接到 PI:
screen /dev/tty.usbXXXX 115200
我可以成功登录并运行命令,但是当我尝试粘贴长文件时,由于换行符被破坏,事情变得非常错误。
例如,如果我复制并粘贴以下文件 (CRLF):
version: "3.9"
services:
ip-initializer:
image: myImage
restart: unless-stopped
environment:
MODULE: ip-initializer
IP: 10.0.0.19
LOGLEVEL: info
volumes:
- ./docker-compose.yml:/docker-compose.yml
- ./logs:/logs
privileged: true
network_mode: host
cap_add:
- NET_ADMIN
healthcheck:
test: ["CMD-SHELL", "ip addr show dev eth0 | grep -q $$IP || exit 1"]
telnet-haas:
image: myImage
restart: unless-stopped
environment:
MODULE: telnet-haas
IP: 10.0.0.20
PORT: 8081
DPRINT_PORT: 8080
COMMANDS: '["?Q102", "?Q100", "?Q500", "?Q303", "?Q201", "?Q600 8505", "?Q600 8511", "?Q600 8512", "?Q600 8515", "?Q600 3011", "?Q600 3027"]'
LOGLEVEL: info
devices:
- '/dev/ttyS1:/dev/ttyOpto'
volumes:
- ./logs:/logs
ports:
- "10.0.0.20:8081:8081/tcp"
- "10.0.0.20:8080:8080/tcp"
depends_on:
- ip-initializer:
condition: service_healthy
telnet-haas2:
image: myImage
restart: unless-stopped
environment:
MODULE: telnet-haas2
IP: 10.0.0.21
PORT: 8081
DPRINT_PORT: 8080
COMMANDS: '["?Q102", "?Q100", "?Q500", "?Q303", "?Q201", "?Q600 8505", "?Q600 8511", "?Q600 8512", "?Q600 8515", "?Q600 3011", "?Q600 3027"]'
LOGLEVEL: info
devices:
- '/dev/ttyS2:/dev/ttyOpto'
volumes:
- ./logs:/logs
ports:
- "10.0.0.21:8081:8081/tcp"
- "10.0.0.21:8080:8080/tcp"
depends_on:
- ip-initializer:
condition: service_healthy
该系列将产生:
它添加了换行符,并且即使没有按下任何键,似乎也会编辑内容。
我需要改变什么来解决这个问题吗?
编辑:
将以下行添加到 ~/.nanorc 就可以了:
unbind ^J main
Loginctl 列出了很多会话,我想以编程方式知道哪一个是图形会话(例如 GNOME 桌面)。
在下面的示例中,我打开了一个 GNome 桌面会话、一个 ssh 连接和一个文本会话 (getty)。
$ loginctl
SESSION UID USER SEAT TTY
3 1000 user seat0 tty2
237 1000 user pts/2
260 1000 user seat0 tty3
3 sessions listed.
$
我可以猜测 tty2 是 GNome 会话,因为我可以使用 Ctrl+Alt+F2 切换到它。tty3 是文本会话 (Ctrl+Alt+F3)。pts/2 是剩余的 ssh 会话。然而,程序如何知道哪个是哪个呢?
注意:我不认为以下方法是解决方案,因为它们不严谨。用户可能可以打开一个新的 tty 并运行 /usr/libexec/gdm-x-session,这会欺骗我的程序
方法一:运行ps -aux | grep /usr/libexec/gdm-x-session
,查看:
... tty2 Sl+ 00:32 0:00 /usr/libexec/gdm-x-session
方法二:运行lsof /dev/tty2
,查看:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
gdm-x-ses 3271 user 0u CHR 4,2 0t0 23 /dev/tty2
...
TLDR - 我已经onlcr
在我的终端中配置了,但我没有看到\r
添加
如果将两个 FTDI 串行转换器插在一起,并将它们都插入我的电脑,我会得到两个/dev/ttyUSB0
端口/dev/ttyUSB1
如果我在不同的终端中打开它们picocom
,我可以通过来回发送消息来确保它们已正确连接,如果我停止使用C-A C-Q
它,则端口配置如下:
$ stty -F /dev/ttyUSB0 -a
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
discard = ^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 -flusho -extproc
$ stty -F /dev/ttyUSB1 -a
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^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 -flusho -extproc
现在,如果我打开两个终端来监听两个串口:
$ cat -v /dev/ttyUSB0
$ cat -v /dev/ttyUSB1
(实际上,对于这个特定的实验,我只需要其中之一,但同时拥有两者也无妨)
然后在第三个终端中,像这样发送一行:
$ echo this is a test > /dev/ttyUSB1
然后再发送一行来证明我正在打印回车符:
$ echo -e 'this is another test\r' > /dev/ttyUSB1
那么这就是我所看到的:
$ cat -v /dev/ttyUSB0
this is a test
this is another test^M
^M
为什么我在第 1 行和^M^M
第 2 行中看不到?
icrnl
在两个设备上都关闭,所以它不应该将其转换回来吗?
为什么会(或不会)发生这种情况?