Debian SSH-调整大小的终端未向bash注册


11

由于磁盘故障,我们最近重新安装了服务器,现在终端大小调整出现了问题。我们安装了Debian 6.0.6。

病征

调整终端大小时,似乎没有正确调整基于ncurses的应用程序(经测试:ytalk,irssi,screen,tmux,某些ncurses示例应用程序)。屏幕通常最终变为空白。在应用程序中强制重绘将使用旧的终端大小进行重绘。

当在bash(4.1.5(1))提示符下调整窗口大小时,COLUMNS和LINES变量永远不会更新。

诊断程序

试图将SIGWINCH捕获在bash中,似乎从未收到过。经过测试:

trap 'touch /home/user/sigwinch' SIGWINCH
trap 'touch /home/user/sigusr1' SIGUSR1
kill -s SIGWINCH $$
kill -s SIGUSR1 $$

哪个应该在我的主目录中创建了两个文件。它只是创造/home/user/sigusr1

尝试kill -s SIGWINCH $$不会导致$ COLUMNS / $ LINES变量的更新。

启用checkwinsizeshopt -s checkwinsize)将导致bash在从任何应用程序返回时更新$ COLUMNS / $ LINES(按预期)。调整checkwinsize启用终端的大小后,这将导致以下结果:

$ echo $COLUMNS ; ls > /dev/null ; echo $COLUMNS
72
107

将我的登录Shell更改为tcsh之类的内容并尝试调整终端的大小即可,正如我测试的其他盒子上的bash一样,可以按预期工作。

我试图删除我的.bashrc,但没有执行任何操作。对于在PuTTY和Linux盒中的某种rxvt型终端中具有不同bash配置的其他几个用户,会出现此问题。

痕迹

我在bash上运行strace并尝试调整终端的大小,没有任何反应(read在打印提示后,呼叫仍然被阻止)。

我在空行上按回车键,bash做了很多事情。我认为相关的输出是:(full strace

1: rt_sigprocmask(SIG_SETMASK, [WINCH], NULL, 8) = 0
2: rt_sigaction(SIGWINCH, {0x80e2c20, [], SA_RESTART}, {0x809c310, [], 0}, 8) = 0
3: rt_sigprocmask(SIG_BLOCK, [INT], [WINCH], 8) = 0
4: write(2, "aa:~$ ", 6)                   = 6
5: rt_sigprocmask(SIG_SETMASK, [WINCH], NULL, 8) = 0
6: rt_sigprocmask(SIG_BLOCK, NULL, [WINCH], 8) = 0
7: read(0,

据我所知,它显示出bash :(我可能会对此产生严重的误解。我不在这里。)

1: Disabling delivery of the SIGWINCH signal, when previously it was allowed.
2: Registering a handler for the SIGWINCH signal.
3: Masking some other combination of signals. As evidenced by line 5, this does not include SIGWINCH.
4: Printing the prompt.
5: Masking SIGWINCH, where previously nothing was blocked.
6: Masking the "union of null and SIGWINCH" which, to my understanding, would result in SIGWINCH being masked.
7: Waiting on input.

在没有这些问题的盒子上执行相同的跟踪(Ubuntu,bash 4.2.24(1))导致:

1: rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
2: rt_sigaction(SIGWINCH, {0x49e320, [], SA_RESTORER|SA_RESTART, 0x7f7ef49f64c0}, {0x457880, [], SA_RESTORER, 0x7f7ef49f64c0}, 8) = 0
3: rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
4: write(2, "aaaaaaa:~$ ", 11)             = 11
5: rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
6: rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
7: read(0,

到底是怎么回事,为什么我的bash坏了?:(

我猜可能某个地方的某个选项默认不会出现意外情况,但是Google的工作时间却什么都没有。

任何帮助和/或指针,不胜感激。这真令人沮丧。

谢谢。


您不是第一个:lists.gnu.org/archive/html/bug-bash/2007-01/msg00084.html 如果您exec bash是手工操作的(因此它不再是登录外壳),它仍然会表现异常吗?如果不是,那该怎么办exec bash -l(所以这是一个登录外壳)?如果是这样,则登录脚本(/etc/profile /etc/profile.d/ ~/.bash_profile ~/.profile)出了点问题,但是我什至不知道该告诉您什么,这可以告诉Shell不这样做SIGWINCH
DerfK

双方exec bashexec bash -l表现出相同的行为。我想这并不算孤单,这只是一个小小的安慰。不过,我对造成这种情况的原因非常困惑。colo从新下载的Debian映像安装了最小安装。我将不得不尝试在本地安装并查看是否存在任何问题,并且(假设没有问题,因为这似乎对其他人没有发生),请开始与正在运行的系统进行比较。
NuclearDog 2012年

我在VM中进行了全新安装,生成了/ etc和/ usr中所有文件的md5总和列表,并与损坏的系统进行了比较。乍一看,我看不到任何明显错误的地方。全新安装后/etc/bash.bashrc所有/etc/profile/etc/profile.d文件均未更改。我已经下载了bash的源代码(apt-get source bash),并且在研究各种./configure源代码之前尝试缩小问题的范围。
NuclearDog 2012年

我用编译了bash减去所有Debian补丁程序--disable-readline --enable-minimal-config --disable-job-control,然后运行strace来查看要删除的文件,并重open命名了所有这些文件,然后再次登录。同样的问题。我已经相当确定地排除了bash本身的任何配置更改。
NuclearDog 2012年

我已经从直接从GNU检索的源中编译了bash 3.2、4.1和4.2,复制了相同的问题。由于某些错误,我无法在没有作业控制且配置最少的情况下编译4.2(已报告给bash团队)。鉴于这是在bash的多个版本中发生的,我开始相信错误可能在于它依赖的一个库。继续前进。
NuclearDog 2012年

Answers:


11

关于strace输出的问题一直困扰着我。也就是说,当bash启动时,似乎已经屏蔽了SIGWINCH。不能确定,不了解它吐出的一半,但是在这一点上当然值得一探。

strace -o strace_file bash -l从tcsh shell运行,那里没有问题。bash从未掩盖SIGWINCH。对其进行屏蔽时,仅是因为它试图恢复先前的屏蔽。那么最初的面具是从哪里来的呢?

在Google上花了更多时间和一个崭新的想法,我发现这篇文章提到aptitude有时会导致sshd以SIGWINCH蒙版开始,然后它将被所有生成的过程直接继承到shell。

我尝试了ps axwwws(所有,超脱,宽输出,信号)。它显示了一些生成的sshd进程已被SIGWINCH屏蔽。

服务器/侦听过程(sshd本身)没有。使用tcsh托管连接的进程也没有。那部分让我感到困惑。我猜(再次,对这一切几乎一无所知),信号掩码是整个进程组范围的东西,tcsh在启动时将其重置,这也影响了ssh。

因此,我一时兴起,我连接了tcsh(以得到一个没有SIGWINCH掩码的干净术语),重新启动ssh,将我的shell改回bash ...并且成功了!一切恢复正常!

据我所知,此框上尚未运行aptitude,并且ssh已重新启动几次以进行配置更改。但是,沿着这条线的某个地方,口罩就进入了,并感染了所有疾病,例如一种严重的疾病。

要识别相同的问题,请运行ps axwwws | grep sshd并查找第二个长列(BLOCKED)设置为0x8000000的sshd进程。那是SIGWINCH。就像是:

   0 26425 0000000000000000 0000000008000000 0000000000001000 0000000180004003 Ss   ?          0:00 sshd: aa [priv]
1000 26430 0000000000000000 0000000008000000 0000000000001000 0000000180010000 S    ?          0:02 sshd: aa@pts/24

要解决此问题(可能不是最佳解决方案,对我有用):

$ sudo apt-get install tcsh
[snip]
$ chsh -s /bin/tcsh
[connect in with a new connection, leave the old one open in case of any issues with tcsh]
$ sudo /etc/init.d/ssh restart

它是固定的。

干杯!


1

尝试这个。做

bash$ shopt -s checkwinsize

在您的外壳中,然后调整终端窗口的大小。


2
欢迎使用ServerFault。您是否注意到用户几年前已经解决了这个问题?
小鸡

1
在我看来,使用tcsh而不是bash是一种解决方法。
gjvc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.