使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄、收藏。可是为什么要这么写却不知其然。本文用一个最短的例子说明脚本的原理。
脚本代码如下:
#!/usr/bin/expect set timeout 30 spawn ssh -l username 192.168.1.1 expect "password:" send "ispass\r" interact
1. [#!/usr/bin/expect]
这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。
注意:这一行需要在脚本的第一行。
2. [set timeout 30]
基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒
3. [spawn ssh -l username 192.168.1.1]
spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。
它主要的功能是给ssh运行进程加个壳,用来传递交互指令。
第1列分钟1~59
第2列小时1~23(0表示子夜)
第3列日1~31
第4列月1~12
第5列星期0~6(0表示星期天)
第6列要运行的命令
下面是crontab的格式:
分 时 日 月 星期 要运行的命令
这里有crontab文件条目的一些例子:
30 21 * * * /usr/local/apache/bin/apachectl restart
上面的例子表示每晚的21:30重启apache。
45 4 1,10,22 * * /usr/local/apache/bin/apachectl restart
上面的例子表示每月1、10、22日的4 : 45重启apache。
10 1 * * 6,0 /usr/local/apache/bin/apachectl restart
上面的例子表示每周六、周日的1 : 10重启apache。
0,30 18-23 * * * /usr/local/apache/bin/apachectl restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
0 23 * * 6 /usr/local/apache/bin/apachectl restart
上面的例子表示每星期六的11 : 00 pm重启apache。
* */1 * * * /usr/local/apache/bin/apachectl restart
每一小时重启apache
* 23-7/1 * * * /usr/local/apache/bin/apachectl restart
晚上11点到早上7点之间,每隔一小时重启apache
0 11 4 * mon-wed /usr/local/apache/bin/apachectl restart
每月的4号与每周一到周三的11点重启apache
有两台服务器,服务器A(10.10.252.158)和服务器B(10.10.252.178)。
现在想在服务器A上通过SSH连接服务器B,或通过SCP、Rsync向服务器B传输文件。但这三种情况下都需要用户提供服务器B的用户名和密码,有些情况下用户可能需要在服务器A上直接通过SCP或Rsync向服务器B上传输文件,而不方便输入服务器B的用户名或密码(比如在计划任务cron中),这是可以使用认证方式连接服务器B,具体方法如下。
(1)以root用户登录服务器A,在服务器A的终端上输入:
ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): (回车)
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): (回车)
Enter same passphrase again: (回车)
这时在/root 目录下生成一个.ssh的文件夹,进入此文件夹,里面有两个文件:id_rsa id_rsa.pub
(2)以root用户登录服务器B,将id_rsa.pub(公钥)文件拷贝到服务器B的/root/.ssh 目录下(如果没有这个目录则创建之)
scp 10.10.252.158:/root/.ssh/id_rsa.pub /root/.ssh/
(3)在服务器B上,将服务器A传输过来的 id_rsa.pub 重命名为 authorized_keys
mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
IP地址、子网掩码:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
HWADDR=00:0c:29:3e:cd:97 #硬件ID不可修改
NETMASK=255.255.255.0
IPADDR=10.10.252.178
NETWORK=10.10.252.0
网关:
vim /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=localhost.localdomain
GATEWAY=10.10.252.1
DNS:
vim /etc/resolv.conf
nameserver 219.232.48.61
nameserver 8.8.4.4
search localdomain
(1).安装libxml2
cd libxml2-2.7.8/
./configure --prefix=/usr/local/libxml2
make && make install
(2).安装libmcrypt
cd ../libmcrypt-2.5.8/
./configure --prefix=/usr/local/libmcrypt
出错: configure: error: C++ compiler cannot create executables See `config.log' for more details.
解决方法:apt-get install g++
./configure --prefix=/usr/local/libmcrypt
make && make install
(3).安装zlib
cd ../zlib-1.2.5/
./configure --prefix=/usr/local/zlib
make && make install
(4)安装libpng
cd ../libpng-1.5.5/
./configure --prefix=/usr/local/libpng
出错:configure: error: zlib not installed
解决方法:重新安装zlib到系统
cd ../zlib-1.2.5/
./configure
make && make install
cd ../libpng-1.5.5/
./configure --prefix=/usr/local/libpng
make && make install
(5)安装jpeg8
cd ../jpeg-8b/
./configure --prefix=/usr/local/jpeg8/ --enable-shared --enable-static
make && make install
(6)安装freetype
cd ../freetype-2.4.5/
./configure --prefix=/usr/local/freetype