爱收集资源网

远程登录服务器的最大隐患

网络整理 2023-09-30 12:03

你是不是常常须要SSH或则telent远程登陆到Linux服务器?你是不是常常为一些长时间运行的任务而头痛,例如系统备份、ftp传输等等。一般情况下我们都是为每一个这样的任务开一个远程终端窗口,由于她们执行的时间太长了。必须等待它执行完毕,在此期间可不能关闭窗口或则断掉连接,否则这个任务都会被杀掉,一切半途而废了。

诱因:SIGHUP讯号

让我们来瞧瞧为何关闭窗口/断掉联接会促使正在运行的程序跑掉。

在Linux/Unix中,有这样几个概念:

按照POSIX.1定义:

因而当网路断掉或终端窗口关掉后,控制进程收到SIGHUP讯号退出,会造成该会话期内其他进程退出。

我们来看一个反例。打开两个SSH终端窗口,在其中一个运行top命令。

#d:f:d:b:b:c:c:6:3:8:3:c:5:f:8:d:a:a:b:7:5:f:3:4:1:6:b:d:f:9:7:b#

在另一个终端窗口,找到top的进程ID为5180,其父进程ID为5128,即登陆shell。

#4:9:6:5:e:d:0:5:a:7:9:9:0:5:6:3:b:7:1:d:f:5:9:c:f:6:2:7:a:6:0:1#

使用pstree命令可以更清楚地看见这个关系:

#3:f:7:d:6:a:c:5:e:8:2:0:b:e:2:9:4:0:4:4:e:2:6:e:9:2:c:9:7:5:c:6#

使用ps-xj命令可以看见,登陆shell(PID5128)和top在同一个会话期,shell为会话期首进程,所在进程组PGID为5128,top所在进程组PGID为5180,为前台进程组。

#9:c:c:8:9:5:d:1:8:f:b:d:6:e:6:7:c:8:d:e:9:9:d:3:6:e:3:f:d:e:c:3#

关掉第一个SSH窗口,在另一个窗口中可以见到top也被杀掉了。

#9:4:3:2:1:a:1:a:e:4:2:d:a:e:0:5:6:0:d:2:f:2:f:e:0:f:f:c:0:c:e:d#

/usr/local/mysql/bin/mysqld_safe–user=mysql&

然而我们好多程序并不象mysqld一样可以弄成守护进程,可能我们的程序只是普通程序而已,通常这些程序虽然使用&结尾,假如终端关掉,这么程序也会被关掉。为了才能后台运行,我们可以忽视SIGHUP讯号,关闭窗口应当就不会影响程序的运行了。nohup命令可以达到这个目的,假如程序的标准输出/标准错误是终端,nohup默认将其重定向到nohup.out文件。值得注意的是nohup命令只是促使程序忽视SIGHUP讯号,还须要使用标记&把它放到后台运行。我们须要使用nohup这个命令,例如我们有个start.sh须要在后台运行,但是希望在后台才能始终运行,这么就使用nohup:句型格式为nohup[argument...]&

#2:b:7:9:9:5:f:d:a:5:f:e:0:2:6:e:0:b:5:8:2:3:c:c:6:6:a:1:2:a:a:c#

在shell中回车后提示:

[~]$appendingoutputtonohup.out

原程序的的标准输出被手动改向到当前目录下的nohup.out文件,起到了log的作用。

然而有时侯在这一步会有问题,当把终端关掉后,进程会手动被关掉,察看nohup.out可以看见在关掉终端顿时服务手动关掉。

咨询红旗Linux工程师后,他也不得其解,在我的终端上执行后,他启动的进程居然在关掉终端后仍然运行。

在第二遍给我演示时,我才发觉我和他操作终端时的一个细节不同:他是在当shell中提示了nohup成功后还须要按终端上按键任意键退回到shell输入命令窗口,之后通过在shell中输入exit来退出终端;而我是每次在nohup执行成功后直接点关掉程序按键关掉终端.。所以这时侯会断开该命令所对应的session,致使nohup对应的进程被通知须要一起shutdown。

这个细节有人和我一样没注意到,所以在这里记录一下了。

附:nohup命令参考

nohup命令

用途:不挂断地运行命令。

句型:nohupCommand[Arg…][&]

描述:nohup命令运行由Command参数和任何相关的Arg参数指定的命令,忽视所有挂断(SIGHUP)讯号。在注销后使用nohup命令运行后台中的程序。要运行后台中的nohup命令,添加&(表示”and”的符号)到命令的尾部。

无论是否将nohup命令的输出重定向到终端,输出都将附加到当前目录的nohup.out文件中。假如当前目录的nohup.out文件不可写,输出重定向到$HOME/nohup.out文件中。假如没有文件能创建或打开以用于追加,这么Command参数指定的命令不可调用。假如标准错误是一个终端,这么把指定的命令献给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

退出状态:该命令返回下述出口值:

126可以查找但不能调用Command参数指定的命令。

127nohup命令发生错误或不能查找由Command参数指定的命令。

否则,nohup命令的退出状态是Command参数指定命令的退出状态。

nohup命令及其输出文件

nohup命令:假如你正在运行一个进程,但是你认为在退出账户时该进程还不会结束,这么可以使用nohup命令。该命令可以在你退出账户/关掉终端以后继续运行相应的进程。nohup就是不挂起的意思(nohangup)。

该命令的通常方式为:nohupcommand&

使用nohup命令递交作业

假如使用nohup命令递交作业,这么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:

nohupcommand>myout.file2>&1&

在前面的反例中,输出被重定向到myout.file文件中。

使用jobs查看任务。

使用fg%n关掉。

另外有两个常用的ftp工具ncftpget和ncftpput,可以实现后台的ftp上传和下载,这样就可以借助那些命令在后台上传和下载文件了。

#f:2:d:9:7:f:3:c:e:4:6:2:6:4:0:c:1:c:d:9:c:3:9:8:9:0:3:a:a:8:c:5#

尽管nohup很容易使用,但还是比较”简陋”的,对于简单的命令才能应付过来,对于复杂的须要人机交互的任务就麻烦了。

虽然我们可以使用一个更为强悍的实用程序screen。流行的Linux发行版(比如RedHatEnterpriseLinux4)一般会自带screen实用程序,假如没有的话,可以从GNUscreen的官方网站下载。

#8:7:4:0:a:c:c:7:b:3:e:4:6:3:9:2:9:9:0:3:2:5:6:6:6:9:6:e:b:5:3:7#

开始使用Screen

简单来说,Screen是一个可以在多个进程之间多路复用一个数学终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中如同操作一个真实的telnet/SSH联接窗口那样。在screen中创建一个新的窗口有这样几种形式:

1.直接在命令行键入screen命令

#3:0:3:4:3:a:d:3:3:9:d:5:e:8:c:3:1:a:f:8:e:f:7:9:c:9:2:3:9:0:f:1#

Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,如同在ssh窗口中那样。在该窗口中键入exit退出该窗口,假如这是该screen会话的惟一窗口,该screen会话退出,否则screen手动切换到前一个窗口。

2.Screen命令后跟你要执行的程序。

#1:e:a:d:4:7:4:f:6:7:8:9:d:f:b:a:1:0:5:d:0:0:6:d:0:6:6:8:8:f:a:6#

Screen创建一个执行vitest.c的单窗口会话,退出vi将退出该窗口/会话。

3.以上两种方法都创建新的screen会话。我们还可以在一个已有screen会话中创建新的窗口。在当前screen窗口中键入C-ac,即Ctrl键+a键,然后再按下c键,screen在该会话内生成一个新的窗口并切换到该窗口。

screen还有更中级的功能。你可以不中断screen窗口中程序的运行而暂时断掉(detach)screen会话,并在此后时间重新联接(attach)该会话,重新控制各窗口中运行的程序。比如,我们打开一个screen窗口编辑/tmp/abc文件:

#0:7:1:f:3:8:5:6:b:f:8:2:5:c:d:6:c:5:4:3:d:0:f:2:f:f:6:5:9:2:6:6#

然后我们想暂时退出做点别的事情,例如出去散遛弯,这么在screen窗口键入C-ad(直接断掉联接也可以的),Screen会给出detached提示:

暂时中断会话

#b:b:e:4:1:4:3:b:4:b:3:8:b:1:3:3:c:b:9:b:7:4:d:f:d:a:0:c:c:a:c:e#

半个小时以后回去了,找到该screen会话:

#d:6:f:0:8:a:a:e:f:1:d:a:d:d:6:a:e:d:2:c:a:9:5:b:c:b:c:9:d:8:4:8#

重新联接会话:

#2:1:f:0:5:5:d:4:1:4:e:e:6:4:d:e:f:5:e:3:5:e:f:e:0:0:6:3:f:6:6:d#

瞧瞧出现哪些了,太棒了,一切都在。继续干吧。

你可能注意到给screen发送命令使用了特殊的键组合C-a。这是由于我们在按键上键入的信息是直接发送给当前screen窗口,必须用其他方法向screen窗口管理器发出命令,默认情况下,screen接收以C-a开始的命令。这些命令方式在screen中称作键绑定(keybinding),C-a称作命令字符(commandcharacter)。

可以通过C-a?来查看所有的键绑定,常用的键绑定有:

C-a?

显示所有键绑定信息

C-aw

显示所有窗口列表

C-aC-a

切换到之前显示的窗口

C-ac

创建一个新的运行shell的窗口并切换到该窗口

C-an

切换到下一个窗口

C-ap

切换到前一个窗口(与C-an相对)

C-a0..9

切换到窗口0..9

C-aa

发送C-a到当前窗口

C-ad

暂时断掉screen会话

C-ak

杀掉当前窗口

C-a[

步入拷贝/回滚模式

Screen常用选项

使用键绑定C-a?命令可以看见,默认的命令字符(Commandkey)为C-a,通配符C-a(literal^a)的字符为a:

Screen常用选项

#f:e:5:a:a:a:0:7:c:8:8:1:9:c:1:6:8:6:5:6:6:5:6:9:9:3:1:5:e:6:1:c#

由于screen把C-a看作是screen命令的开始,所以假如你想要screen窗口接收到C-a字符,就要输入C-aa。Screen也容许你使用-e选项设置自己的命令字符和通配符字符,其格式为:

-exyx为命令字符,y为通配符命令字符的字符

下边命令启动的screen会话指定了命令字符为C-t,通配符C-t的字符为t,通过C-t?命令可以看见该变化。

自定义命令字符和通配符字符

#d:d:8:e:8:c:6:6:6:c:f:4:7:b:5:d:d:8:4:5:4:6:c:8:5:1:4:2:8:5:8:a#

#0:f:8:9:5:7:3:8:8:7:3:4:5:f:f:2:4:0:c:f:8:0:4:9:d:1:7:4:5:3:c:b#

其他常用的命令选项有:

-cfile

使用配置文件file,而不使用默认的$HOME/.screenrc

-d|-D[pid.tty.host]

不开启新的screen会话,而是断掉其他正在运行的screen会话

-hnum

指定历史回滚缓冲区大小为num行

-list|-ls

列出现有screen会话,格式为pid.tty.host

-d-m

启动一个开始就处于断掉模式的会话

-rsessionowner/[pid.tty.host]

重新联接一个断掉的会话。多用户模式下联接到其他用户screen会话须要指定sessionowner,须要setuid-root权限

-Ssessionname

创建screen会话时为会话指定一个名子

-v

显示screen版本信息

-wipe[match]

同-list,但删除这些难以联接的会话

下例显示当前有两个处于detached状态的screen会话,你可以使用screen-r重新联接上:

#7:5:2:3:6:6:b:a:f:b:3:5:c:a:1:6:b:a:3:9:e:e:e:0:4:e:e:0:0:9:e:3#

若果因为某种诱因其中一个会话跑掉了(比如人为杀掉该会话),这时screen-list会显示该会话为dead状态。使用screen-wipe命令消除该会话:

#c:d:5:8:f:4:5:e:1:c:b:2:c:c:e:a:d:5:8:b:b:6:c:a:7:b:5:4:5:f:6:5#

-d-m选项是一对很有意思的搭档。她们启动一个开始就处于断掉模式的会话。你可以在此后须要的时侯联接上该会话。有时侯这是一个很有用的功能,例如我们可以使用它调试后台程序。该选项一个更常用的搭配是:-dmSsessionname

启动一个初始状态断掉的screen会话:

#f:7:2:2:0:a:7:8:e:d:8:3:3:c:d:c:f:b:1:3:c:5:7:d:f:1:2:a:d:f:a:2#

联接该会话:

#9:0:5:6:9:3:f:9:e:b:c:9:3:4:2:1:6:9:f:c:f:8:a:c:e:d:e:e:1:2:f:7#

管理你的远程会话

先来瞧瞧怎样使用screen解决SIGHUP问题,例如现今我们要ftp传输一个大文件。假如按老的办法,SSH登入到系统,直接ftp命令开始传输,然后。。假如网路速率还可以,恭喜你,不用等太长时间了;假如网路不好,老老实实等着吧,只能传输完毕再断掉SSH联接了。让我们使用screen来试试。

SSH登入到系统,在命令行键入screen。

#2:f:6:3:8:1:c:e:7:c:0:f:4:d:a:3:9:f:8:f:0:b:5:1:0:0:7:7:7:8:c:b#

在screenshell窗口中输入ftp命令,登陆,开始传输。不乐意等了?OK,在窗口中键入C-ad:

管理你的远程会话

#1:6:5:0:6:a:3:3:c:8:1:e:a:c:e:4:5:c:7:e:a:4:4:e:9:d:5:6:e:4:8:0#

之后。。退出SSH登入?随你怎么,只要别杀掉screen会话。

是不是很便捷?更进一步,虽然我们可以借助screen这些功能来管理你的远程会话,保存你所有的工作内容。你是不是每次登入到系统都要开好多窗口,之后每天都要重复打开关掉这种窗口?让screen来帮你"保存"吧,你只须要打开一个ssh窗口,创建须要的screen窗口,退出的时侯C-ad"保存"你的工作,上次登陆后直接screen-r就可以了。

最好能给每位窗口起一个名子,这样好记些。使用C-aA给窗口取名字。使用C-aw可以见到这种窗口名子,可能名子出现的位置不同。使用putty:

putty

#2:e:c:6:c:e:d:9:8:6:5:9:3:7:7:8:f:1:c:7:b:1:7:c:b:7:3:1:8:9:9:d#

使用telnet:

telnet

#9:4:b:c:8:3:3:5:d:d:0:a:2:6:1:6:2:3:8:5:9:0:c:f:f:3:d:0:6:f:a:b#

易语言关闭后进程还在
上一篇:手机上网慢?检查这些情况 下一篇:没有了