分类 Shell编程 下的文章

昨天晚上VPS重启了,NGINX没有起来。于是写了一下脚本,自启动的。

cat /etc/init.d/nginx
#!/bin/sh
#
# nginx       This shell script takes care of starting and stopping
#               the nginx.
#
# chkconfig: - 64 36
# description:  nginx.
# processname: nginx
# config: /usr/local/nginx/conf/nginx
# pidfile: /usr/local/nginx/logs/nginx.pid
if [ -f /etc/init.d/functions ]
then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ]
then
. /etc/rc.d/init.d/functions
else
exit 0
fi
nginx=/usr/local/nginx/sbin/nginx
conf=/usr/local/nginx/conf/nginx
prog=nginx
RETVAL=0
start() {
if [ -n "`/sbin/pidof $prog`" ]
then
echo "$prog: already running"
return 1
fi
echo "Starting $prog:"
base=$prog
$nginx
if [ -z "`/sbin/pidof $prog`" ]
then
RETVAL=1
fi
if [ $RETVAL -ne 0 ]
then
echo "Startup failure"
else
echo "Startup success"
fi
return $RETVAL
}
reload() {
if [ -z "`/sbin/pidof $prog`" ]
then
RETVAL=1
fi
if [ $RETVAL -ne 0 ]
then
echo "nginx no have run"
else
echo "reload nginx config"
$nginx -s reload
RETVAL=$?
if [ $RETVAL -ne 0 ]
then
echo "reload nginx config failure"
else
echo "reload nginx config success"
fi
fi
}
stop() {
if [ -z "`/sbin/pidof $prog`" ]
then
RETVAL=1
fi
if [ $RETVAL -ne 0 ]
then
echo "nginx no have run"
else
echo "Stopping $prog:"
$nginx -s stop
RETVAL=$?
if [ $RETVAL -ne 0 ]
then
echo "Shutdown failure"
else
echo "Shutdown success"
fi
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $nginx
RETVAL=$?
;;
restart)
stop
start
;;
reload)
reload
;;
*)
echo "Usage: $prog {start|stop|restart|status|reload}"
exit 1
esac
exit $RETVAL
添加权限和添加自启动
[root@key1088 init.d]# chmod 755 nginx
[root@key1088 init.d]# chkconfig --add nginx
[root@key1088 init.d]# chkconfig --list nginx
nginx           0:off   1:off   2:off   3:off   4:off   5:off   6:off
[root@key1088 init.d]# chkconfig --level 235 nginx on
[root@key1088 init.d]# chkconfig --list nginx
nginx           0:off   1:off   2:on    3:on    4:off   5:on    6:off

awkprintf感觉很好用,print好用多了。

和c的printf用法一样。

awk -F# '{printf("insert into info values("%s","%s","%s");n", $1, $2, $3)}' sqlfile.sql

 

度娘,你的编辑器啥时候好用啊。

systime函数返回从1970年1月1日开始到当前时间(不计闰年)的整秒数

利用strftime()函数格式化时间

  • 实例:

                 $ awk '{ now = systime(); print now }'
  • strftime函数使用C库中的strftime函数格式化时间。格式如下:

                 systime( [format specification][,timestamp] )

    Table 3. 日期和时间格式说明符

    格式描述%a星期几的缩写(Sun)%A星期几的完整写法(Sunday)%b月名的缩写(Oct)%B月名的完整写法(October)%c本地日期和时间%d十进制日期%D日期 08/20/99%e日期,如果只有一位会补上一个空格%H用十进制表示24小时格式的小时%I用十进制表示12小时格式的小时%j从1月1日起一年中的第几天%m十进制表示的月份%M十进制表示的分钟%p12小时表示法(AM/PM)%S十进制表示的秒%U十进制表示的一年中的第几个星期(星期天作为一个星期的开始)%w十进制表示的星期几(星期天是0)%W十进制表示的一年中的第几个星期(星期一作为一个星期的开始)%x重新设置本地日期(08/20/99)%X重新设置本地时间(12:00:00)%y两位数字表示的年(99)%Y当前月份%Z时区(PDT)%%百分号(%)

    实例:

  •             $ awk '{ now=strftime( "%D", systime() ); print now }'
  •             $ awk '{ now=strftime("%m/%d/%y"); print now }'

转自:www.chinaunix.net。作者:老表

 

在工作中经常遇到给两台主机建立ssh信任,手动建立太费事了,索性胡乱写了个脚本ssh_trust.sh来自动建立信任:

  1. #!/bin/bash
  2. src_host=$1
  3. src_username=$2
  4. src_passwd=$3

  5. dst_host=$4
  6. dst_username=$5
  7. dst_passwd=$6

  8. #在远程主机1上生成公私钥对
  9. Keygen()
  10. {
  11. expect << EOF

  12. spawn ssh $src_username@$src_host ssh-keygen -t rsa
  13. while 1 {

  14.         expect {
  15.                         "password:" {
  16.                                         send "$src_passwdn"
  17.                         }
  18.                         "yes/no*" {
  19.                                         send "yesn"
  20.                         }
  21.                         "Enter file in which to save the key*" {
  22.                                         send "n"
  23.                         }
  24.                         "Enter passphrase*" {
  25.                                         send "n"
  26.                         }
  27.                         "Enter same passphrase again:" {
  28.                                         send "n"
  29.                                         }

  30.                         "Overwrite (y/n)" {
  31.                                         send "nn"
  32.                         }
  33.                         eof {
  34.                                    exit
  35.                         }

  36.         }
  37. }
  38. EOF
  39. }

  40. #从远程主机1获取公钥保存到本地
  41. Get_pub()
  42. {
  43. expect << EOF

  44. spawn scp $src_username@$src_host:~/.ssh/id_rsa.pub /tmp
  45. expect {
  46.              "password:" {
  47.                             send "$src_passwdn";exp_continue
  48.                 }
  49.                 "yes/no*" {
  50.                             send "yesn";exp_continue
  51.                 }   
  52.                 eof {
  53.                                 exit
  54.                 }
  55. }
  56. EOF
  57. }
  58. #将公钥的内容附加到远程主机2的authorized_keys
  59. Put_pub()
  60. {
  61. src_pub="$(cat /tmp/id_rsa.pub)"
  62. expect << EOF
  63. spawn ssh $dst_username@$dst_host "chmod 700 ~/.ssh;echo $src_pub >> ~/.ssh/authorized_keys;chmod 600 ~/.ssh/authorized_ke
  64. ys"
  65. expect {
  66.             "password:" {
  67.                         send "$dst_passwdn";exp_continue
  68.              }
  69.             "yes/no*" {
  70.                         send "yesn";exp_continue
  71.              }   
  72.             eof {
  73.                         exit
  74.              }
  75. }
  76. EOF
  77. }
  78. Keygen
  79. Get_pub
  80. Put_pub

脚本主要由3个expect组成,比较简单,用法是

  1. ./ssh_trust.sh host1 user1 passwd1 host2 user2 passwd2

即建立从user1@host1到user2@host2的ssh信任。
说明:
1、当然得安装expect
2、脚本放在第三方机器(能远程登录host1和host2)上运行即可,当然放在host1和host2上运行也行。
3、如果想批量建立信任,可以编辑一个文件夹file如:

  1. host1 user1 passwd1 host2 user2 passwd2
  2. host3 user3 passwd3 host4 user4 passwd4
  3. host5 user5 passwd5 host6 user6 passwd6

使用下面命令执行脚本即可:

  1. xargs -n6 ./ssh_trust.sh < file

4、仓促写的,脚本只是简单实现功能,使用前确保参数的可用性(用户密码主机名),不然很容易报错
5、只在linuxredhat上测试过,运行成功,欢迎大家提意见~~

linux下命令使用详解---合并文件的列

 

功能说明:合并文件的列。

 

语  法:paste [-s][-d ][--help][--version][文件...]

补充说明:paste指令会把每个文件以列对列的方式,一列列地加以合并。

参  数:

 -d或--delimiters=  用指定的间隔字符取代跳格字符。

 -s或--serial  串列进行而非平行处理。

 --help  在线帮助。

 --version  显示帮助信息。

 

例:

 

1.paste的拼凑原理是什么?

 

这个很简单,和cut的原理几乎一样,就是将几个文件的相应行用制表符连接起来,并输出到标准输出。

 

paste最简单的使用方法是:

 

[rocrocket@rocrocket programming]$ cat p1.txt

 

123[rocrocket@rocrocket programming]$ cat p2.txt

a

b

c

[rocrocket@rocrocket programming]$ paste p1.txt p2.txt

1    a

2    b

3    c

[rocrocket@rocrocket programming]$ paste p1.txt p2.txt|sed-n l

1ta$

2tb$

3tc$

看到制表符了吧,它就是默认的间隔符。

 

2 上面的例子是两个文件的,那三个文件呢?

 

当然也可以了。看看例子吧:

 

[rocrocket@rocrocket programming]$ cat p3.txt

I

II

III

[rocrocket@rocrocket programming]$ paste p1.txt p2.txt p3.txt

1    a    I

2    b    II

3    c    III

[rocrocket@rocrocket programming]$ paste p3.txt p2.txt p1.txt

I    a    1

II   b    2

III  c    3

可见paste的结果是和文件列表的顺序有关的。

 

3 我不想用制表符来间隔,我想用星号(*),可以么?

 

行的!使用-d符号就可以设定间隔符,这和cut没有两样。看看例子:

 

[rocrocket@rocrocket programming]$ paste -d'*' p3.txt p2.txt p1.txt

I*a*1

II*b*2

III*c*3

要注意一点,此处一定要把星号用引号括起来哦(单引号双引号均可),否则shell会把星号扩展为当前目录下的文件列表哦,小心小心。

 

4 我看过paste命令的man,里面提到了一个-s选项,我不懂是什么意思?

 

这个很好解释,继续上面的例子,看看这个命令:

 

[rocrocket@rocrocket programming]$ paste -s-d"*" p3.txt p2.txt p1.txt

I*II*III

a*b*c

1*2*3

呵呵,懂了吧,-s就是以每个文件为一个处理单元,将其中的所有行以-d设定的间隔符相连接组成一大行,输出到标准输出中。