📄 5.b.top
字号:
#!/usr/local/bin/perl# Here we set manual_stty on the process so we can do things like#hit ^Z to stop it instead of the ^Z going to the process on the other machine.# This is to say, normally when you interact with a process STDIN is#put in raw mode so everything you type talks to the process at the other end.# Picture this. When you telnet somewhere and start a process (top#for example) you are talking to telnet in raw mode. If you press ^Z it#goes through telnet to the shell on the remote machine and the process#at the other end is stopped. Here we're going to make it so raw mode is#never set and when you press ^Z or ^C it will stop/interrupt Expect.# Also briefly demonstrated is the use of Expect::interconnect(),#a more general/versatile alternative to interact.use Expect;# Debugging anyone?# $Expect::Log_Stdout=1;# $Expect::Exp_Internal=1;# $Expect::Debug=1;$RSH='/usr/bin/ssh';$host_to_login_to=shift(@ARGV);print "Enter password: ";$|=1;# First we have to initialize STDIN in to an expect object.$stdin=Expect->exp_init(\*STDIN);# Now turn off echoing$stdin->exp_stty('-echo');# The easy way to do this is:#$password=<STDIN>;#chop $password;# The somewhat harder way is to use $stdin->expect. This would look like:# ($match_num,$error,$match,$before,$after)=$stdin->expect(undef,"\n"); $password = $before;# Turn echo back on$stdin->exp_stty('echo');# print that newline that wasn't echoedprint "\n";#$Expect::Exp_Internal=1;$rsh=Expect->spawn($RSH,$host_to_login_to);# Look for a password prompt.$rsh->expect(30,'-re','word:\s$')||(die"Never got password prompt\n");print $rsh "$password\r";# Look for a prompt. Prompt can be # $ > or ] followed by a whitespace.$prompt = '[\]\$\>\#]\s$';# Note the use of -re$rsh->expect(30,'-re',$prompt)||(die "Never got prompt on host\n");# Start topprint $rsh "exec top\r";# We already have an inited handle for STDIN above which we can use.# We don't just do $rsh->interact because it will go monkeying# with tty settings by default (set it raw).$stdin->manual_stty(1);# Instead we use interconnect directly. # The trick here is to make sure:# 1. Everything listening to a handle is added to its# listen group.# 2. Only what you want is jabbering at STDOUT.# # In this case only $rsh will talk to STDOUT so we don't have to # change any log_stdout() settings.$stdin->set_group($rsh);Expect::interconnect($stdin,$rsh);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -