自动ssh的expect脚本


#!/usr/bin/expect 
set timeout 5
set cmd_prompt "]#|~]?"
set server [lindex $argv 0] 
set user [lindex $argv 1] 
set passwd [lindex $argv 2] 

spawn ssh -l $user $server 
expect { 
"(yes/no)" { send "yes\r"; exp_continue } 
"password:" { send "$passwd\r" } 
}
#expect "$cmd_prompt" interact
expect "*Last login*" interact

NFS server


开启nfs-server和client

fc18上启动nfs真是比较麻烦,server和client端都需要启动好几个服务,所以需要特别记录一下。


server端


[root@dlp ~]# vi /etc/idmapd.conf 
# line 5: uncomment and change to your domain name
Domain = server.world 
[root@dlp ~]# vi /etc/exports 
# write like below *note
/home 10.0.0.0/24(rw,sync,no_root_squash,no_all_squash)
/home 表示目录
ip 允许访问的子网,*代表所有
no_root_squash:对于登陆NFS主机的共享目录用户如果是root的话则对该目录具有root权限。建议不用为好!
root_squash:对于登陆NFS主机的共享目录用户使用者如果是root则它的权限将被压缩成匿名使用者,
同时它的UID和GID都会变成nobody那个系统账号的身份。
all_squash:不管登陆NFS主机用户身份如何,它的身份都会被压缩成匿名使用者,通常就是nobody
anonuid:anonuid=xxx,制定NFS服务器/etc/passwd中匿名用户的UID
anongid:anonuid=xxx,制定NFS服务器/etc/passwd中匿名用户的GID
sync:数据在请求时写入共享
async:NFS在写入数据前可响应请求
secure:NFS通过1024以下的安全端口发送
insecure:NFS通过1024以上端口发送
hide:不共享NFS目录的子目录
no_hide:共享NFS目录的子目录



[root@dlp ~]# systemctl start rpcbind.service 
[root@dlp ~]# systemctl start nfs-server.service 
[root@dlp ~]# systemctl start nfs-lock.service 
[root@dlp ~]# systemctl start nfs-idmap.service 
[root@dlp ~]# systemctl enable rpcbind.service 
[root@dlp ~]# systemctl enable nfs-server.service 
[root@dlp ~]# systemctl enable nfs-lock.service 
[root@dlp ~]# systemctl enable nfs-idmap.service
最终要的还要关闭防火墙:
systemctl disable firewalld.service


exportfs

exportfs [-aruv]
-a:全部挂载(或卸载) /etc/exports文件设定
-r:重新挂载 /etc/exports设定,也可以同步更新/etc/exports设定
-u:卸载某一目录
-v:在export时,将共享目录显示在屏幕上


showmount -a
在NFS Server上显示已经mount上本机NFS目录的Client机器。


client端


[root@www ~]# vi /etc/idmapd.conf 
# line 5: uncomment and change to your domain name
 Domain = server.world 
 [root@www ~]# systemctl start rpcbind.service 
 [root@www ~]# systemctl start nfs-lock.service 
 [root@www ~]# systemctl start nfs-idmap.service 
 [root@www ~]# systemctl start nfs-mountd.service 
 [root@www ~]# systemctl enable rpcbind.service 
 [root@www ~]# systemctl enable nfs-lock.service 
 [root@www ~]# systemctl enable nfs-idmap.service 
 [root@www ~]# systemctl enable nfs-mountd.service 
 [root@www ~]# mount -t nfs dlp.server.world:/home /home 
 [root@www ~]# df -h 
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 992M     0  992M   0% /dev
tmpfs                   1002M     0 1002M   0% /dev/shm
tmpfs                   1002M  1.5M 1001M   1% /run
tmpfs                   1002M     0 1002M   0% /sys/fs/cgroup
/dev/mapper/fedora-root   16G  1.2G   14G   8% /
tmpfs                   1002M     0 1002M   0% /tmp
/dev/vda1                485M   71M  389M  16% /boot
dlp.server.world:/home    16G  1.2G   14G   8% /home
# home directory on NFS is mounted 
 [root@www ~]# vi /etc/fstab 
/dev/mapper/VolGroup-lv_root /                       ext4    defaults  1 1
UUID=65ec32e2-f459-4d63-b8b0-e18124b50f3a /boot      ext4    defaults  1 2
/dev/mapper/VolGroup-lv_swap swap                    swap    defaults  0 0
# add at the lat line: change home directory this server mounts to the one on NFS
dlp.server.world:/home /home                         nfs     defaults  0 0

nfs卡住问题

如果服务端意外停止,在客户机上使用 ls,df等磁盘查看命令时,会卡住,并且ctrl+c都不能强制退出。
原因是默认的mount是“硬”挂载,会不断的重试。解决办法是:
1、mount的时候加上 -s 参数,作为“软”挂载
2、umount -f /xxxxx/xxxx 用这个命令来取消挂载。
如果出现device busy的错误,说明还有进程在使用该挂载点,要把进程停了,才能umount


通过试验发现,这几个方法都不管用。依然一断网就会挂住。


xlicp在命令行下使用剪切板

一、安装xclip
ubuntu下的用户可以只用apt-get来安装:


sudo apt-get install xclip
其他发行版的用户可以选择自己的安装方式,也可以用源码编译安装,xclip项目的主页是:http://sourceforge.net/projects/xclip/


二、使用
xclip可以将内容输出到‘X’的剪切板中,比如:


echo “Hello, world” | xclip
执行这个命令后你就可以用鼠标中键来在X程序中将内容粘贴出来。但是更多的时候,我们需要不仅仅把内容输出到‘X’的剪切板中,而是希望可以在GUI程序中用ctrl + v也可以粘贴(比如,输出到gnome的剪切板中),下面这段命令就可以让你将内容输出到gnome的剪切板中:


echo “Hello, world” | xclip -selection clipboard
再在一个GUI程序中按下ctrl + v,看下是不是粘贴上去了呢?顺着这个命令,我也重新写了一下ifconfig,让它在执行后输入内容到终端的同时,也将ip地址输出到剪切板中,因为通常情况下,查看ifconfig就是为了获取机器的ip地址:


alias ifconfig=’/sbin/ifconfig && echo `/sbin/ifconfig | sed -n 2p | awk “{ print \$2 }” | grep -o “[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}”` | xclip -selection clipboard’


zsh 配置

setopt autocd

如果你想要避免在切换目录时一直输入乏味的cd命令(比如使用/etc而不是cd /etc)你可以设置autocd选项。


PS1

转义序列 打印效果
%T 系统时间(时:分)
%* 系统时间(时:分:秒)
%D 系统日期(年-月-日)
%n 你的用户名
%B - %b 开始到结束使用粗体打印
%U - %u 开始到结束使用下划线打印
%d 你目前的工作目录
%~ 你目前的工作目录相对于~的相对路径
%M 计算机的主机名
%m 计算机的主机名(在第一个句号之前截断)
%l 你当前的tty


zsh设置为默认sh

我们可以通过usermod命令来设置某一个给定用户的shell。


代码 4.1: 使用usermod命令永久地切换到zsh
usermod -s /bin/zsh userlogin


或者
(使用你的用户名替代”username”)
$ chsh -s /bin/zsh username


其他

setopt AUTO_CONTINUE


为了提交工作效率,可以定义一些函数或者常用的alias
f() {
echo “find . -iname "$1"”
find . -iname ”$1
}



autoload copy-earlier-word
zle -N copy-earlier-word
bindkey ‘^[,’ copy-earlier-word



setopt AUTO_PUSHD
setopt PUSHD_IGNORE_DUPS


my_accounts=(
{r00t,root}@{192.168.1.1,192.168.0.1}
kardinal@linuxtoy.org
123@211.148.131.7
)
zstyle ‘:completion:*:my-accounts’ users-hosts $my_accounts


zstyle ‘:completion:*:scp:*’ tag-order \
files users ‘hosts:-host hosts:-domain:domain hosts:-ipaddr”IP\ Address *’
zstyle ‘:completion:*:scp:*’ group-order \
files all-files users hosts-domain hosts-host hosts-ipaddr
zstyle ‘:completion:*:ssh:*’ tag-order \
users ‘hosts:-host hosts:-domain:domain hosts:-ipaddr”IP\ Address *’
zstyle ‘:completion:*:ssh:*’ group-order \
hosts-domain hosts-host users hosts-ipaddr
zstyle ‘*’ single-ignored show



hash 路径别名

hash -d blog=”/home/henryyan/work/blog/henryyan.github.com”
cd ~blog


文件关联

在图形化的文件管理器中,通常我们只要单击/双击某个文件,文件管理器就会调用相应的程序来打开该文件。
其实,这样的文件关联在 Zsh 中也可以实现。具体操作步骤如下:
添加下列内容到你的 $HOME/.zshrc 文件中:
autoload -U zsh-mime-setup
zsh-mime-setup
以关联扩展名为 png 的图像文件为例,假设要通过 pho 程序来查看,那么在 $HOME/.zshrc 中可以这样定义:
alias -s png=pho
我们以 alias 的形式来实现文件关联,其中 png 为要关联文件的扩展名,= 右边的 pho 为关联的程序。这里的 -s 必不可少。
要关联其他类型的文件,只需如法炮制即可。
为了使 .zshrc 生效,需要 source 该文件。
现在,在 Zsh 中,例如要查看 linuxtoy.png 文件,只要输入该文件名(可按 Tab 自动补完)并按回车,Zsh 便会自动调用 pho 来打开。


cd扩展

“cd ….”之类,会根据点的个数补全路径,比如 “…”补全为 “../../” ,“….”补全为 “../../..”


配合我修改的 tab 键:空行 tab 出 “cd ”,自己点点点后回车,O了



user-ret(){
    if [[ $BUFFER = "" ]] ;then
        BUFFER="ls"
        zle end-of-line
        zle accept-line
    elif [[ $BUFFER =~ "^cd\ ...+$" ]] ;then
        BUFFER=${${BUFFER//./..\/}/..\//}
        zle end-of-line
        zle accept-line
    else
        zle accept-line
    fi
}
zle -N user-ret
bindkey "\r" user-ret


解决too many open file的有关问题

ulimit是bash的内建命令,并不是一个程序。
ulimit -a 查看所有设置


通过ulimit -n 命令可以查看linux系统里打开文件描述符的最大值,一般缺省值是1024,对一台繁忙的服务器来说,这个值偏小,所以有必要重新设置linux系统里打开文件描述符的最大值。


如果单个进程打开的文件句柄数量超过了系统定义的值,就会提到“too many files open”的错误提示。如何知道当前进程打开了多少个文件句柄呢?下面一段小脚本可以帮你查看:



lsof -n |awk ‘{print $2}’|sort|uniq -c |sort -nr|more
其中第一行是打开的文件句柄数量,第二行是进程号。


Linux有硬性限制和软性限制。可以通过ulimit来设定这两个参数
ulimit -HSn 4096
H指定了硬性大小,S指定了软性大小,n表示设定单个进程最大的打开文件句柄数量.


limits.conf

此修改只是临时有效,要想长期有效需要修改:/etc/security/limits.conf
在文件末尾加上:


* soft nofile 65536
* hard nofile 65536
此文件还有其他的相关设置:
以下是文件描述:


#Each line describes a limit for a user in the form:
#
#<domain>  <type>  <item>  <value>
#
#Where:
#<domain> can be:
#        - an user name
#        - a group name, with @group syntax
#        - the wildcard *, for default entry
#        - the wildcard %, can be also used with %group syntax,
#                 for maxlogin limit
#
#<type> can have the two values:
#        - "soft" for enforcing the soft limits
#        - "hard" for enforcing hard limits
#
#<item> can be one of the following:
#        - core - limits the core file size (KB)
#        - data - max data size (KB)
#        - fsize - maximum filesize (KB)
#        - memlock - max locked-in-memory address space (KB)
#        - nofile - max number of open files
#        - rss - max resident set size (KB)
#        - stack - max stack size (KB)
#        - cpu - max CPU time (MIN)
#        - nproc - max number of processes
#        - as - address space limit
#        - maxlogins - max number of logins for this user
#        - maxsyslogins - max number of logins on the system
#        - priority - the priority to run user process with
#        - locks - max number of file locks the user can hold
#        - sigpending - max number of pending signals
#        - msgqueue - max memory used by POSIX message queues (bytes)
#        - nice - max nice priority allowed to raise to
#        - rtprio - max realtime priority

ubuntu还需要修改pam

对于ubuntu还需要修改pam.d配置,才能生效


1. sudo vi /etc/pam.d/common-session
2. Add session required pam_limits.so to the end of the file.
3. Reboot the OS.


版本编号方面

在SVN中,新版本的版本号不是针对某个特定文件的,而是针对整个库而言的。
而cvs是对文件的版本编号。
svn的版本类似是对整个库的快照。
SVN的全局性版本编号为SVN带来了诸多的优势:如对目录或文件执行拷贝,无论涉及多少文件,SVN不需要对单个文件依次执行拷贝命令,仅仅需要建立一个指向相应的全局版本号的一个指针即可。


目录的版本控制

CVS只能对文件进行版本控制,不能对目录进行版本控制。
SVN将目录作为一类特殊的文件来处理。当目录中的子目录/文件被删除、重命名、或新的子目录/文件被创建时,目 录的内容将发生改变。因此,SVN象记录普通文件的修改历史一样记录对目录的修改历史,当发生文件/目录的移动、重命名或拷贝操作时,SVN能够准确记录 操作前后的历史联系。同样,像对文件的不同历史版本进行比较一样,SVN支持对目录的不同历史版本的比较,清晰展现目录的变化历史。


原子性提交

SVN提交文件,只有当全部文件修改都成功入库,该提交才变得有效。一旦中断,SVN将会自动执行“回滚”(rollback)操作。SVN 这种机制保证所有的修改要么全部入库生效,要么一个也不入库。由于SVN的原子性提交特性和全局版本编号方式,当提交成功完成时,一个唯一的、新的全局版 本编号产生,而提交时用户提供的日志信息与该新的版本编号关联,只进行一次存储(区别于CVS的按文件重复存储)。
而CVS则采用线性、串行的批量提交,即依次地,一个接一个地执行提交,每成功提交一个文件,该文件的一个新的版本即被记录到版本库中。但当任 何原因造成批量操作的中断时,版本库往往处于一个不一致的状态。另外,CVS即使在批量提交不发生中断时也会造成不一致:假设用户A启动一个需要较长时间 才能完成的批量提交;与此同时,用户B执行cvsupdate操作。此时,用户B很有可能得到一个不一致的更新,即用户B通过“更新”操作,得到用户A的 部分修改文件。


差异化的二进制文件处理

SVN每次提交后版本库中只存储相对于先前版本的差异,从而可以节省大量的存储空间。更为重要的是,当客户端需要获取新的版本 时,SVN只传输版本的差异,从而大大减少对网络带宽的消耗。


** grub输出到串口

将GRUB输出重定向到串口(Edit /boot/grub/grub.conf)


serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
terminal --timeout=5 console serial
grub引导过程中, 会将输出同时发送到终端屏幕和串口.
grub引导过程中将在终端和连接到串口的超级终端上提示Press any key to continue,
每秒钟提示一次, 共5次, 可修改menu.lst文件terminal行中的–timeout=10改变提示次数,
在这一段时间内, 可以在终端的键盘, 或者连接到串口的超级终端中按任意键进入grub选择菜单.
如果5秒内没有在终端和连接串口的超级终端上按任意键, 则grub的选择菜单将出现在console上,
如果希望默认情况下, grub选择菜单出现在串口上, 则可修改grub.conf将
console serial修改为serial console.


将kernel输出信息输出到串口(编辑 /boot/grub/grub.conf 有的为menu.lst)
增加kernel引导参数如下:


kernel  /boot/vmlinuz-2.6.32-29 root=/dev/hda1 ro console=ttyS0,115200n8 console=tty0
grub2的例子
修改文件/etc/default/grub


#显示启动菜单
#GRUB_HIDDEN_TIMEOUT=0
修改相应的变量如下:
GRUB_CMDLINE_LINUX="console=ttyS0,115200"
GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1"

  1. 运行命令, 更新grub
    sudo update-grub


  2. 在/etc/init/下,创建文件ttyS0.conf:


# ttyS0 - getty
start on stopped rc RUNLEVEL=[23]
stop on runlevel [!23]

respawn
exec /sbin/getty -L 115200 ttyS0 vt100

  1. 查看/etc/securetty中,含有ttyS0否。没有则加上。
  2. BIOS开启串口
  3. 另一台机器,联上串口线,开启teraterm,设置115200 8n1
  4. 重启机器, 看到teraterm输出Linux的启动信息。


通过比较生成的grub.cfg
发现多了一个


terminal_output serial
terminal_input serial



基本使用

本地监听
nc -l 3333
远端访问
nc 192.168.0.1 3333


传送文件

发送端
cat backup.iso | nc -l 3333
接收端
nc 192.168.0.1 3333 > backup.iso


显示传送进度,可以使用管道监控,pv命令
以上命令修改为:
cat backup.iso | pv -b | nc -l 3333
nc 192.168.0.1 3333 | pv -b > backup.iso


本地打包文件,传送到远端
tar -czf - /etc/ | nc -l 3333
接收端
nc 192.168.0.1 3333 | pv -b > mybackup.tar.gz


端口扫描

扫描端口,并返回相关信息
nc -z 192.168.0.1 80-90