曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3722|回复: 0
打印 上一主题 下一主题

stty -- 设置终端

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-1-3 10:34:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当你从 Windows 的 Putty,Xshell 上连接 Linux 服务器时,Putty, Xshell 这些就可以理解是个终端,一般名字如 pts/1, pts/2 等,当你按下 Ctrl + Alt +F[1~6] 进行切换时,得到的也是一个终端,名字如 tty1, tty2 等。在这些终端窗口里,你会输入内容,如果发现所输入的某些内容不正确时,你可能会用退格键也可能会用 del 键将它们删除;你还会按下 Ctrl + C 组合键来终端一个正在运行着的程序,也会按下 Ctrl + Z 来让一个正在运行的程序挂起,等等这些都是一个终端的属性。

stty 就是用来设置这些终端的属性命令。一般情况下,这些预设已经很完善,并不需要我们修改,但是在某些场合,也会根据需要做一些针对性改变。使用 stty -a 可以查看到当前的终端设置,如:
stty -a
speed 38400 baud; rows 28; columns 115; 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; flush = ^O; min = 1; time = 0;
-parenb -parodd 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
可见选项非常多。比如上面的 intr = ^C 表示发出的中断信号为 Ctrl + c ,这里的 ^ 符号表示的就是 Ctrl 键。你可以对此进行修改:stty intr = ^k ,这样之前需要按下 Ctrl + c 才可以中断程序运行的组合键现在就变成了 Ctrl + k 。

可以如下查看某个终端的设置信息,如:
beyes@linux-xh53:~> stty < /dev/pts/0
speed 38400 baud; line = 0;
-brkint -imaxbel
上面查看终端 /dev/pts/0 的信息。

往往在一些需要读入用户密码的脚本里需要使用到该命令。先看下面一个脚本,它读入用户密码,然后输出这个密码:
[Bash shell] 纯文本查看 复制代码
#!/bin/sh
echo "Enter password: "
read PASSWD
echo $PASSWD

运行脚本:
beyes@linux-xh53:~> sh stty.sh
Enter password:    #输入密码
hello world          #这个不好,密码被显示出来了
hello world
像上面,我们一般不愿意在输入密码时密码会直接显示在屏幕上,那么可以在脚本里使用 stty 来屏蔽这个回显功能:

在脚本里使用该命令,一般事先需要做好备份,以便在设置后恢复,那么可以在脚本里加上这么一句:
stty -echo
这样就相当于取消了回显功能,此时你再运行脚本并输入密码时,密码是不会显示在屏幕上了。但是我们只是希望在输入密码时使用该屏蔽功能,而在别的时候,还是能够正常的显示出输入的内容,比如用户名,那么就需要在脚本里事先对终端设置进行备份,然后修改设置,最后回复设置,比如下面这样:
[Bash shell] 纯文本查看 复制代码
#!/bin/sh


OLDCONFIG=`stty -g`
stty -echo


echo "Enter password: "
read PASSWD
echo $PASSWD


stty $OLDCONFIG

上面脚本中,stty -g 将当前终端的配置输出并保存在 OLDCONFIG 变量中,在最后一句时回复先前设置。

cbreak 选型和 icanon 是相同的,它们的功能都是使能 erase (向后删除字符), kill(删除整条命令) 这些特殊字符(可用 stty -a 查看其组合键)。默认情况下是使能的,如果使用 -icanon 那么就是禁用这些功能,下面测试这个选项。


测试脚本如下:
[Bash shell] 纯文本查看 复制代码
#!/bin/sh
 read val
 echo $val
 

这是正常的情况,它通过终端读入内容存往变量 $val 中。如果我们觉得输入的字符不正确时,我们可以使用退格将之删除。但是当我们使用 -icanon 时,退格键就失去了作用,同样整行删除组合键(Ctrl + u) 也失效。修改上面脚本如下:
[Bash shell] 纯文本查看 复制代码
#!/bin/sh
 
 SAVEDSTTY=`stty -g`
 
 stty -icanon
 
 read val
 echo $val
 
 stty $SAVEDSTTY

这么做之后,当我们再使用退格键时,会看到:

上图中的 ^? 字符就是退格键所代表的字符,但此时已经不能删除掉输入的字符 k 。


这里还介绍一个更实用的功能,就是如何在命令行里恢复正常设置。比如你弄乱了回车键的回车功能,不但如此,还可能添加了一些其它的设置,现在感觉一切变得很糟糕,想敲些什么命令时,但回车都不管用了,怎么办?这里,一般的,组合键 Ctrl + J 就相当于一个回车,并且都可以被识别,那么要回复初始设置,可以:
1. 按下 Ctrl + J
2. 输入 stty sane
3. 再按下 Ctrl + J
这样,就可以恢复预设了。

stty 的选项相当多,具体的可以参考说明手册。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 04:10 , Processed in 0.068930 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表