Tuesday, March 17, 2009

075 使用SysRq键安全重启Linux系统

SysRq组合键是Linux的一个内核级命令,你可以通过它执行很多底层任务。比如你可以通过它从冻结状态恢复,或者重新启动系统。这个命令包括:
Alt+SysRq+commandkey:在很多系统中SysRq键就是‘Print Scr’ 键。首先你需要激活这个键。
echo "1" > /proc/sys/kernel/sysrq

SysRq组合键列表:
  • ‘k’:关闭当前虚拟控制台的所有进程。
  • ’s’:尝试同步所有加载的文件系统。
  • ‘b’:在无需卸载分区或者同步的情况下,立即重启系统。
  • ‘e’:给除了init以外所有进程发送SIGTERM
  • ‘m’:在控制台显示当前的内存信息。
  • ‘i’ :给除了init以外所有进程发送SIGKILL。
  • ‘r’:将键盘从原始模式转换到XLATE模式。
  • ’S’ :同步所有加载的文件系统。
  • ‘t’:在控制台上输出当前任何及其信息的列表。
  • ‘u’:以只读模式重新加载所有已经加载的文件系统。
  • ‘o’:立即关闭系统。
  • ‘p’ :在控制台上打印当前的注册者和标志信息。
  • ‘0-9′ :设置控制台的日志级别,从而控制哪些内核信息会打印到当前的控制台。
  • ‘f’:将调用oom_kill来关闭当前占用很多内存的进程。
  • ‘h’ :显示帮助信息。

我们也可以通过把这些信息放到/proc/sysrq-trigger 中来完成同样的事情。比如你可以执行下面的命令来重启系统。
echo "b" > /proc/sysrq-trigger

使用SysRq键安全重启Linux系统
要安全的重启一个已经挂起的Linux系统,可以这样作。这可以避免下次启动时做的fsck检查。比如按下Alt+SysRq+字母(这个字母可以是下面黑体字中的任何一个):
  • unRaw:控制键盘从X11模式返回。
  • tErminate:给每个进程发送一个SIGTERM,允许它们安全的终止。
  • kIll:发送SIGILL给所有进程,立即结束进程。
  • Sync:将数据同步到磁盘上。
  • Unmount:以只读模式重新加载所有文件系统。
  • reBoot:重新启动。

Monday, March 16, 2009

074 Crontab命令的使用

你可以通过Crontab命令在指定的日期或时间执行shell脚本或者Linux命令。必须系统管理员希望每天定时进行备份任务。
如何在cron中增加一个任务
# crontab –e
0 5 * * * /root/bin/backup.sh

它会在每天临晨五点执行 /root/bin/backup.sh
Cron字段的描述
以下是crontab文件的格式:
{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script}

minute:允许0-59的值
hour:允许0-23的值
day-of-month:允许0-31的值
month:允许1-12的值,1代表一月,12代表十二月
Day-of-week:允许0-7的值。星期日可以是0或者7
Crontab的例子
1.在每天12:01执行任务,午夜的1分钟后。这是一个备份数据的好时候。
1 0 * * * /root/bin/backup.sh

2.在每个工作日的下午11:59进行备份
59 11 * * 1,2,3,4,5 /root/bin/backup.sh

3.下面的命令执行相同的任务
59 11 * * 1-5 /root/bin/backup.sh

4.每隔5分钟执行一次
*/5 * * * * /root/bin/check-status.sh

5.在每月第一天下午1:10执行
10 13 1 * * /root/bin/full-backup.sh

6.在工作日的下午11点执行
0 23 * * 1-5 /root/bin/incremental-backup.sh

Crontab命令选项
  • crontab –e :编辑crontab文件,如果不存在就创建一个
  • crontab –l :显示crontab文件内容
  • crontab -r :删除crontab文件
  • crontab -ir : 在用户删除crontab文件的之前提示用户

073 结合ssh-agent 使用 ssh-copy-id

结合ssh-add/ssh-agent 使用 ssh-copy-id
当我们没有给 -i参数传递值,或者~/.ssh/identity.pub 不存在,我们会得到下面的异常消息
jsmith@local-host$ ssh-copy-id -i remote-host

/usr/bin/ssh-copy-id: ERROR: No identities found

如果你通过ssh-add给ssh-agent加载密钥文件,那么ssh-copy-id会从ssh-agent得到密钥文件并复制到远程主机上。比如它会复制通过ssh-add -L命令得到的密钥文件。



jsmith@local-host$ ssh-agent $SHELL

jsmith@local-host$ ssh-add -L
The agent has no identities.

jsmith@local-host$ ssh-add
Identity added: /home/jsmith/.ssh/id_rsa
(/home/jsmith/.ssh/id_rsa)

jsmith@local-host$ ssh-add -L
ssh-rsa
AAAAB3NzaC1yc2EAAAABIwAAAQEAsJIEILxftj8aSxMa3d8t6JvM79D
aHrtPhTYpq7kIEMUNzApnyxsHpH1tQ/Ow==
/home/jsmith/.ssh/id_rsa

jsmith@local-host$ ssh-copy-id -i remote-host
jsmith@remote-host’s password:
Now try logging into the machine, with “ssh remote-
host’”, and check in: .ssh/authorized_keys to make sure
we haven’t added extra keys that you weren’t expecting.
[注意:这里加载了通过 ssh-add -L得到的密钥]

有关ssh-copy-id 三个需要小心的地方
  1. 缺省的公钥: ssh-copy-id使用~/.ssh/identity.pub作为缺省的公钥文件(比如,当你每个-i参数传值时)。但是,可能我想使用id_dsa.pub, or id_rsa.pub, 或者identity.pub作为缺省的公钥文件。如果这些文件存在,默认使用的是identity.pub文件。
  2. 未指定代理:如果在运行ssh-agent 时ssh-add -L 返回“The agent has no identities”(比如,ssh-agent没有密钥),ssh-copy-id 仍然会把“The agent has no identities”复制到远程主机的认证密钥文件中。
  3. 认证密钥文件中存在重复的密钥:我希望ssh-copy-id 命令可以识别出远程主机上的认证密钥文件中重复的密钥。但是如果你重复执行ssh-copy-id ,他会在认证密钥文件中增加多个重复的密钥而不会检查他们是否重复。尽管这样不会影响我们的工作,但是这样确实让认证文件看起来很凌乱。

Sunday, March 15, 2009

072 在OpenSSH中创建一个无需密码的登录

你可以通过以下3个步骤,使用ssky-keygen 和ssh-copy-id命令,不用密码就可以登录到远程的Linux服务器。
ssh-keygen用于创建公钥和密钥,ssh-copy-id 命令可以把本地的公钥复制到远程主机的authorized_keys 文件中,ssh-copy-id 同时会给远程主机的主目录中的~/.ssh和~/.ssh/authorized_keys设置适当的权限。
第一步:在本地通过ssh-key-gen创建公钥和密钥
jsmith@local-host$ ssh-keygen

Generating public/private rsa key pair.
Enter file in which to save the key
(/home/jsmith/.ssh/id_rsa):[Enter key]
Enter passphrase (empty for no passphrase): [Press
enter key]
Enter same passphrase again: [Pess enter key]
Your identification has been saved in
/home/jsmith/.ssh/id_rsa.
Your public key has been saved in
/home/jsmith/.ssh/id_rsa.pub.
The key fingerprint is:
33:b3:fe:af:95:95:18:11:31:d5:de:96:2f:f2:35:f9
jsmith@local-host

第二步:使用ssh-copy-id将公钥复制到远程主机上
jsmith@local-host$ ssh-copy-id -i ~/.ssh/id_rsa.pub
remote-host

jsmith@remote-host’s password:
Now try logging into the machine, with “ssh 'remote-
host’”, and check in:
.ssh/authorized_keys to make sure we haven’t added
extra keys that you weren’t expecting.

注意:ssh-copy-id将密钥文件加入到了远程主机的.ssh/authorized_key中。
第三步:无需密码登录到远程主机
jsmith@local-host$ ssh remote-host

Last login: Sun Nov 16 17:22:33 2008 from 192.168.1.2

[注意:SSH没有向你询问密码]

jsmith@remote-host$ [现在你已经登录到远程主机]

071 创建一个用户组并在这个组里增加一个用户

创建一个developers用户组
校验一下这个组是否成功的创建。
# grep developer /etc/group 
developers:x:511:

给这个组里增加一个用户
你不能通过useradd在一个组里创建一个已经存在的用户,否则你会得到一个错误信息。
# useradd -G developers jsmith 
useradd: user jsmith exists

# usermod -g developers jsmith

校验组是否修改成功
# grep jsmith /etc/passwd 
jsmith:x:510:511:Oracle
Developer:/home/jsmith:/bin/bash

# id jsmith
uid=510(jsmith) gid=511(developers)
groups=511(developers)

# grep jsmith /etc/group
jsmith:x:510:
developers:x:511:jsmith

070 Linux下创建用户

创建一个用户-基本命令
只听过用户名称:
# useradd jsmith

创建一个用户-提供更多的参数
你可以给useradd命令提供以下参数:
-c :增加对用户的描述
-e :指定用户的过期时间(格式为mm/dd/yy)

# adduser -c "John Smith - Oracle Developer" -e
12/31/09 jsmith

验证一下是否成功的增加了用户:
# grep jsmith /etc/passwd
jsmith:x:510:510:John Smith - Oracle
Developer:/home/jsmith:/bin/bash

修改用户密码
# passwd jsmith

Changing password for user jsmith.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
注意:最好按照最佳建议设置一个安全的密码。

如何识别用户的缺省值
# useradd –D 

GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel

Thursday, March 12, 2009

069 创建交换swap 文件系统

创建一个交换(swap)文件的方法如下:
# dd if=/dev/zero of=/home/swap-fs bs=1M count=512 
512+0 records in
512+0 records out

# ls -l /home/swap-fs
-rw-r--r-- 1 root root 536870912 Jan 2 23:13
/home/swap-fs

使用mkswap命令在我们刚才创建的/home/swap-fs文件中创建一个Linux交换区域。
# mkswap /home/swap-fs  

Setting up swapspace version 1, size = 536866 kB

创建了这个交换区域后就可以通过swapon来激活它。
# swapon /home/swap-fs

把下面的代码加入到 /etc/fstab 中然后重启系统让其生效:
/home/swap-fs swap swap defaults 0 0