愚蠢的地球人

Linux计划任务工具Crontab使用详解

Ubuntu自带Crontab,默认没有开启cron日志记录

1.开启Crontab日志

vi /etc/rsyslog.d/50-default.conf

把#cron.*前面的#号去掉

重启rsyslog服务

service rsyslog restart

然后再重启crontab服务

service cron restart

2.开启定时任务:crontab –e

周期有5个域,分别是分钟,小时,日(day of month),月(month of year),周几(day of week)
每个域不加限制任意的话用*,格式为:

*  *  *  *  *  command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

间隔执行时间设定
* * * * *  每分钟执行
*/5 * * * *  每五分钟执行 (/表示频率)  
0 * * * *  每小时执行
* */2 * * * 每2小时执行
0 0 * * *  每天执行
0 0 * * 0  每周执行
0 0 1 * *  每月执行
0 0 1 1 *  每年执行
30 8 * * * 每天8:30分执行
30,50 * * * * 每小时的30和50分各执行一次(,表示并列)
30 8 3-6 * * 每个月的3号到6号的8:30执行一次 (-表示范围)
30 8 * * 1 每个星期一的8:30执行一次 (周的范围为0-7,0和7代表周日)

例:
每晚的21:30重启apache
30 21 * * * /usr/local/etc/rc.d/lighttpd restart

每2分钟运行Python脚本
*/2 * * * * /usr/bin/python3.5 /root/1.py &>> /root/auto.log

常用的几个命令格式
crontab -l #显示用户的crontab文件的内容
crontab -e #编辑用户的crontab文件的内容
crontab -r #删除用户的crontab文件

3.查看crontab日志
less /var/log/cron.log



Linux用户用户组以及文件权限

Linux是一个多用户、多任务的操作系统。用户在系统中是分角色的,在Linux系统中,由于角色不同,权限和所完成的任务也不同;比如一台Linux服务器,上面有 FTP 用户、系统管理员、超级管理员 root、web 用户、常规普通用户等,不同用户所具有的权限也不同,要完成不同的任务得需要不同的用户。多用户既可以本地登录也可以通过远程来登录。多用户系统对系统管理更方便更安全,比如某用户下的某个文件不想让其它用户看到,只需要设置一下文件的权限,只有本用户可读可写就行了。

Linux的用户分为以下几类:
超级管理员用户 root:系统唯一,是真实的,可以登录系统,可以操作系统任何文件和命令,拥有最高权限;
虚拟用户:虚拟用户实际上就是去掉了登录SHELL权限的用户,因为默认登录shell是 '/sbin/nologin'。他没有能力登录系统,但可以进行其他任何操作,是系统运行不可缺少的用户,比如 nobody 和 ftp 等,我们访问服务器上的的 Web Server,就是 nobody 用户;我们匿名访问 FTP Server 时,会用到用户 ftp 或 nobody ;这类用户有些是系统自身拥有的,而非后来添加的,当然我们也可以添加虚拟用户;
普通真实用户:这类用户能登录系统,但只能操作自己家目录的内容;权限有限;这类用户都是系统管理员自行添加的;

用户组(group)就是具有相同特征的用户(user)的集合体;比如有时我们要让多个用户具有相同的权限,比如查看、修改某一文件或执行某个命令,这时我们需要用户组,我们把用户都定义到同一用户组,我们通过修改文件或目录的权限,让用户组具有一定的操作权限,这样用户组下的用户对该文件或目录都具有相同的权限,这是我们通过定义组和修改文件的权限来实现的;

用户和用户组的对应关系是:一对一、多对一、一对多或多对多;
一对一:某个用户可以是某个组的唯一成员;
多对一:多个用户可以是某个唯一的组的成员,不归属其它用户组;
一对多:某个用户可以是多个用户组的成员;
多对多:多个用户对应多个用户组,并且几个用户可以是归属相同的组;

查看用户和用户组的命令:
whoami 查看当前登录用户名,例如:
liugeng@liugeng-Ubuntu:~$ whoami
liugeng
groups 查看当前登录用户的组内成员,例如:
liugeng@liugeng-Ubuntu:~$ groups liugeng
liugeng : liugeng adm cdrom sudo dip plugdev lpadmin sambashare
liugeng@liugeng-Ubuntu:~$ groups root
root : root

Linux的用户信息保存在/etc/passwd文件中,/etc/shadow文件存放的是用户密码相关信息。
/etc/passwd文件格式:
用户名:密码:UID:GID:用户信息:HOME目录路径:用户shell
其中UID为0则是用户root,1~499为系统用户,500以上为普通用户
/etc/shadow保存用户密码信息,包括加密后的密码,密码过期时间,密码过期提示天数等。


/etc/group 用户组(group)配置文件;
/etc/gshadow 用户组(group)的影子文件;
/etc/group 文件是用户组的配置文件,内容包括用户和用户组,并且能显示出用户是归属哪个用户组或哪几个用户组,因为一个用户可以归属一个或多个不同的用户组;同一用户组的用户之间具有相似的特征。比如我们把某一用户加入到root用户组,那么这个用户就可以浏览root用户家目录的文件,如果root用户把某个文件的读写执行权限开放,root用户组的所有用户都可以修改此文件,如果是可执行的文件,root用户组的用户也是可以执行的;用户组的特性在系统管理中为系统管理员提供了极大的方便,但安全性也是值得关注的,如某个用户下有对系统管理有最重要的内容,最好让用户拥有独立的用户组,或者是把用户下的文件的权限设置为完全私有;另外root用户组一般不要轻易把普通用户加入进去。
/etc/group 的格式如下:
group_name:passwd:GID:user_list
第一字段:用户组名称;
第二字段:用户组密码;
第三字段:GID(Group ID);
第四字段:用户列表,每个用户之间用,号分割;本字段可以为空;如果字段为空表示用户组为GID的用户名;
用户登录后,/etc/passwd 文件里的GID为用户的初始用户组。
用户的初始用户组这一事实不会在 /etc/group 中体现。


管理用户(user)的工具或命令:
useradd 添加用户
adduser 添加用户
passwd 为用户设置密码
usermod 修改用户命令,可以通过usermod 来修改登录名、用户的家目录等等;
pwcov 同步用户从/etc/passwd 到/etc/shadow
pwck 校验用户配置文件/etc/passwd 和/etc/shadow 文件内容是否合法或完整;
pwunconv 是 pwcov 的立逆向操作,是从/etc/shadow和 /etc/passwd 创建/etc/passwd ,然后会删除 /etc/shadow 文件;
finger 查看用户信息工具
id 查看用户的UID、GID及所归属的用户组
chfn 更改用户信息工具
su 用户切换工具
sudo 是通过另一个用户来执行命令(execute a command as another user),sudo 后面直接执行命令;
visudo 是编辑 /etc/sudoers 的命令,也可以不用这个命令,直接用vi 来编辑 /etc/sudoers 的效果是一样的;
 

管理用户组(group)的工具或命令:
groupadd 添加用户组;
groupdel 删除用户组;
groupmod 修改用户组信息
groups 显示用户所属的用户组
grpck grpconv 通过/etc/group和/etc/gshadow 的文件内容来同步或创建/etc/gshadow ,如果/etc/gshadow 不存在则创建;
grpunconv 通过/etc/group 和/etc/gshadow 文件内容来同步或创建/etc/group ,然后删除gshadow文件;
 

/etc/skel目录是存放用户启动文件的目录,这个目录是由root权限控制,当我们添加用户时,这个目录下的文件自动复制到新添加的用户的家目录下;/etc/skel 目录下的文件都是隐藏文件,也就是类似.file格式的;我们可通过修改、添加、删除/etc/skel目录下的文件,来为用户提供一个统一、标准的、默认的用户环境;

liugeng@liugeng-Ubuntu:~$ ls -la /etc/skel/
总用量 40
drwxr-xr-x   2 root root  4096 12月 10 02:35 .
drwxr-xr-x 146 root root 12288 12月 15 11:43 ..
-rw-r--r--   1 root root   220 9月   1  2015 .bash_logout
-rw-r--r--   1 root root  3771 9月   1  2015 .bashrc
-rw-r--r--   1 root root  8980 4月  20  2016 examples.desktop
-rw-r--r--   1 root root   807 6月   7  2019 .profile


/etc/skel 目录下的文件,一般是我们用 useradd 和 adduser 命令添加用户(user)时,系统自动复制到新添加用户(user)的家目录下;如果我们通过修改 /etc/passwd 来添加用户时,我们可以自己创建用户的家目录,然后把 /etc/skel 下的文件复制到用户的家目录下,然后要用 chown 来改变新用户家目录的属主;

/etc/login.defs 配置文件是当创建用户时的一些规划,比如创建用户时,是否需要家目录,UID和GID的范围;用户的期限等等,这个文件是可以通过root来定义的;


用户用户组文件权限操作命令详解:

切换有效用户组:
[root@Ubuntu]#newgrp 用户组名
要离开新的有效用户组,则输入exit回车。

新建用户:
[root@Ubuntu]#useradd 用户名 -g 初始用户组 -G 其他用户组(修改/etc/group) -c 用户说明 -u 指定UID

建完用户需要为用户设置密码:
[root@Ubuntu]#passwd 用户名

用户要修改自己密码:
[root@Ubuntu]#passwd

修改用户信息:
[root@Ubuntu]#usermod 参数 用户名
参数:
 -c 说明
 -g 组名 初始用户组
 -e 过期日期 格式:YYYY-MM-DD
 -G 组名 其他用户组
 -l 修改用户名
 -L 锁定账号(在/etc/shadow文件中用户对应密码密码串的前面加上两个叹号(!!))
 -U 解锁

删除用户:
[root@Ubuntu]#userdel [-r] 用户名
其中,参数-r为删除用户的home目录。
其实,可能在系统其他地方也有该用户文件,要完整删除一个用户和其文件要先找到属于他的文件:
[root@Ubuntu]#find / -user 用户名
然后删除,再运行userdel删除用户。

查看可用shell:
[root@Ubuntu]#chsh -l
修改自己的shell命令:
[root@Ubuntu]#chsh -s

查看自己或某人UID/GID信息:
[root@Ubuntu]#id [用户名]
返回信息中groups为有效用户组

新增用户组:
[root@Ubuntu]#groupadd 用户组名

修改用户组名:
[root@Ubuntu]#groupmod -n 名称

删除用户组:
[root@Ubuntu]#groupdel 用户组名

设置用户组密码:
[root@Ubuntu]#gpasswd 用户组名

如果gpasswd加上参数则有其他功能

设置用户组管理员:
[root@Ubuntu]#gpasswd -A 用户名 用户组名

添加某帐号到组:
[root@Ubuntu]#gpasswd -M 用户名 用户组名

从组中删除某帐号:
[root@Ubuntu]#gpasswd -d 用户名 用户组名

passwd相关参数操作:
-l 锁用户
-u 解锁用户
-n 天数  密码不可改天数
-x 天数  密码过期天数
-w 天数  警告天数


文件权限操作命令详解:
先看个实例:
[root@Ubuntu]#ls -al
ls -al 命令是列出目录的所有文件,包括隐藏文件。隐藏文件的文件名第一个字符为'.'
-rw-r--r--  1 root root    81 08-02 14:54 gtkrc-1.2-gnome2
-rw-------  1 root root   189 08-02 14:54 ICEauthority
-rw-------  1 root root    35 08-05 10:02 .lesshst
drwx------  3 root root  4096 08-02 14:54 .metacity
drwxr-xr-x  3 root root  4096 08-02 14:54 nautilus

列表的列定义如下:
[权限属性信息] [连接数] [拥有者] [拥有者所属用户组] [大小] [最后修改时间] [文件名]

权限属性列表为10个字符:
第一个字符表示文件类型,d为目录 -为普通文件 l为连接 b为可存储的接口设备 c为键盘鼠标等输入设备
2、3、4个字符表示所有者权限,5、6、7个字符表示所有者同组用户权限,8、9、10为其他用户权限
第二个字符表示所有者读权限,如果有权限则为r,没有权限则为-
第三个字符表示所有者写权限,如果有权限则为w,没有权限则为-
第四个字符表示所有者执行权限,如果有权限则为x,没有权限则为-
第五个字符表示所有者同组用户读权限,如果有权限则为r,没有权限则为-
第六个字符表示所有者同组用户写权限,如果有权限则为w,没有权限则为-
第七个字符表示所有者同组用户执行权限,如果有权限则为x,没有权限则为-
第八个字符表示其他非同组读权限,如果有权限则为r,没有权限则为-
第九个字符表示其他非同组写权限,如果有权限则为w,没有权限则为-
第十个字符表示其他非同组执行权限,如果有权限则为x,没有权限则为-

修改文件所属组:
[root@Ubuntu]#chgrp [-R] 组名 文件名
其中-R为递归设置

修改文件的所有者和组:
[root@Ubuntu]#chown [-R] 用户[:用户组] 文件名

修改文件访问权限:
[root@Ubuntu]#chmod [-R] 0777 文件名

linux 查看用户及用户组的方法
------------------------------------------------------------------
whois
功能说明:查找并显示用户信息。
语  法:whois [帐号名称]
补充说明:whois指令会去查找并显示指定帐号的用户相关信息,因为它是到Network Solutions 的WHOIS数据库去查找,所以该帐号名称必须在上面注册方能寻获,且名称没有大小写的差别。
------------------------------------------------------------------
whoami
功能说明:显示用户名称。
语  法:whoami [--help][--version]
补充说明:显示自身的用户名称,本指令相当于执行"id -un"指令。
参  数:
--help  在线帮助。
--version  显示版本信息。
------------------------------------------------------------------
who
功能说明:显示目前登入系统的用户信息。
语  法:who [-Himqsw][--help][--version][am i][记录文件]
补充说明:执行这项指令可得知目前有那些用户登入系统,单独执行who指令会列出登入帐号,使用的    终端机,登入时间以及从何处登入或正在使用哪个X显示器。
参  数:
-H或--heading  显示各栏位的标题信息列。
-i或-u或--idle  显示闲置时间,若该用户在前一分钟之内有进行任何动作,将标示成"."号,如果该用户已超过24小时没有任何动作,则标示出"old"字符串。
-m  此参数的效果和指定"am i"字符串相同。
-q或--count  只显示登入系统的帐号名称和总人数。
-s  此参数将忽略不予处理,仅负责解决who指令其他版本的兼容性问题。
-w或-T或--mesg或--message或--writable  显示用户的信息状态栏。
--help  在线帮助。
--version  显示版本信息。
------------------------------------------------------------------
w
功能说明:显示目前登入系统的用户信息。
语  法:w [-fhlsuV][用户名称]
补充说明:执行这项指令可得知目前登入系统的用户有那些人,以及他们正在执行的程序。单独执行w
指令会显示所有的用户,您也可指定用户名称,仅显示某位用户的相关信息。
参  数:
-f  开启或关闭显示用户从何处登入系统。
-h  不显示各栏位的标题信息列。
-l  使用详细格式列表,此为预设值。
-s  使用简洁格式列表,不显示用户登入时间,终端机阶段作业和程序所耗费的CPU时间。
-u  忽略执行程序的名称,以及该程序耗费CPU时间的信息。
-V  显示版本信息。
------------------------------------------------------------------
finger
finger 命令的功能是查询用户的信息,通常会显示系统中某个用户的用户名、主目录、停滞时间、登录时间、登录shell等信息。如果要查询远程机上的用户信息,需要在用户名后面接“@主机名”,采用[用户名@主机名]的格式,不过要查询的网络主机需要运行finger守护进程。
该命令的一般格式为:
finger [选项] [使用者] [用户@主机]
命令中各选项的含义如下:
-s 显示用户的注册名、实际姓名、终端名称、写状态、停滞时间、登录时间等信息。
-l 除了用-s选项显示的信息外,还显示用户主目录、登录shell、邮件状态等信息,以及用户主目录下的.plan、.project和.forward文件的内容。
-p 除了不显示.plan文件和.project文件以外,与-l选项相同。 
[例]在本地机上使用finger命令。
$ finger xxq
Login: xxq Name:
Directory: /home/xxq Shell: /bin/bash
Last login Thu Jan 1 21:43 (CST) on tty1
No mail.
No Plan. 
$ finger
Login Name Tty Idle Login Time Office Office Phone
root root *1 28 Nov 25 09:17
……
------------------------------------------------------------------
vlock(virtual console lock)
功能说明:锁住虚拟终端。
语  法:vlock [-achv]
补充说明:执行vlock指令可锁住虚拟终端,避免他人使用。
参  数:
-a或--all  锁住所有的终端阶段作业,如果您在全屏幕的终端中使用本参数,则会将用键盘
切换终端机的功能一并关闭。
-c或--current  锁住目前的终端阶段作业,此为预设值。
-h或--help  在线帮助。
-v或--version  显示版本信息。
------------------------------------------------------------------
usermod
功能说明:修改用户帐号。
语  法:usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-l <帐号名称>][-s ][-u ][用户帐号]
补充说明:usermod可用来修改用户帐号的各项设定。
参  数:
-c<备注>  修改用户帐号的备注文字。
-d登入目录>  修改用户登入时的目录。
-e<有效期限>  修改帐号的有效期限。
-f<缓冲天数>  修改在密码过期后多少天即关闭该帐号。
-g<群组>  修改用户所属的群组。
-G<群组>  修改用户所属的附加群组。
-l<帐号名称>  修改用户帐号名称。
-L  锁定用户密码,使密码无效。
-s  修改用户登入后所使用的shell。
-u  修改用户ID。
-U  解除密码锁定。
------------------------------------------------------------------
userdel
功能说明:删除用户帐号。
语  法:userdel [-r][用户帐号]
补充说明:userdel可删除用户帐号与相关的文件。若不加参数,则仅删除用户帐号,而不删除相关文件。
参  数:
-f  删除用户登入目录以及目录中所有文件。
------------------------------------------------------------------
userconf
功能说明:用户帐号设置程序。
语  法:userconf [--addgroup <群组>][--adduser <用户ID><群组><用户名称>][--delgroup <群组>][--deluser <用户ID>][--help]
补充说明:userconf实际上为linuxconf的符号连接,提供图形界面的操作方式,供管理员建立与管理各类帐号。若不加任何参数,即进入图形界面。
参  数:
--addgroup<群组>  新增群组。
--adduser<用户ID><群组><用户名称>  新增用户帐号。
--delgroup<群组>  删除群组。
--deluser<用户ID>  删除用户帐号。
--help  显示帮助。
------------------------------------------------------------------
useradd
功能说明:建立用户帐号。
语  法:useradd [-mMnr][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-s ][-u ][用户帐号] 或 useradd -D [-b][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-s ]
补充说明:useradd可用来建立用户帐号。帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。
参  数:
-c<备注>  加上备注文字。备注文字会保存在passwd的备注栏位中。 
-d<登入目录>  指定用户登入时的启始目录。
-D  变更预设值.
-e<有效期限>  指定帐号的有效期限。
-f<缓冲天数>  指定在密码过期后多少天即关闭该帐号。
-g<群组>  指定用户所属的群组。
-G<群组>  指定用户所属的附加群组。
-m  自动建立用户的登入目录。
-M  不要自动建立用户的登入目录。
-n  取消建立以用户名称为名的群组.
-r   建立系统帐号。
-s  指定用户登入后所使用的shell。
-u  指定用户ID。


深入理解sudo与su之间的区别

在Linux下对很多文件进行修改都需要有root(管理员)权限,但是很多人都不清楚sudo和su命令的区别,网上查了很多资料,归纳了一下,大致如下:


两个命令的最大区别是 sudo 命令需要输入当前用户的密码,su 命令需要输入 root 用户的密码。
另外一个区别是其默认行为,sudo 命令只允许使用提升的权限运行单个命令,而 su 命令会启动一个新的 shell,同时允许使用 root 权限运行尽可能多的命令,直到明确退出登录。

su 命令
su 命令的主要作用是让你可以在已登录的会话中切换到另外一个用户,这个工具可以让你在不登出当前用户的情况下登录为另外一个用户。
su 命令经常被用于切换到超级用户或 root 用户,也可以用于切换到任意非 root 用户。 su 的默认用户是 root,所以只需在终端直接输入 su 即可切换到 root 用户,su 命令要求输入的密码是 root 用户的密码,在输入正确的密码之后,su 命令会在终端的当前会话中打开一个子会话。
还有一种方法可以切换到 root 用户:运行 su - root
那么,su 命令与 su - 命令之间有什么区别呢?前者在切换到 root 用户之后仍然保持之前用户的环境,而后者则是创建一个新的环境(由 root 用户 ~/.bashrc 文件所设置的环境),相当于使用 root 用户正常登录。

sudo 命令
sudo 命令是用来获取临时的 root 权限,不过有时间限制,Ubuntu默认为一次时长15分钟。提示输入密码是当前用户的密码,而不是超级账户的密码。要求执行该命令的用户必须在 sudoers 中才可以。
sudo 的配置文件是 sudoers 文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在 /etc/sudoers,属性必须为0440。

sudo -i 和 sudo su 命令没有时间限制。执行该命令后提示符变为“#”而不是“$”。想退回普通账户时可以执行“exit”或“logout” 。
sudo -i 与 sudo - root、sudo -i root、sudo -、sudo root效果相同。
-i 是指更改 shell 环境参量为目标用户的,如果不指定用户则默认为 root。
sudo -i 运行后 PWD=/root
sudo su 运行后 PWD=/home/用户名(当前用户主目录)

sudo vs. su
两个命令的最大区别是:sudo 命令需要输入当前用户的密码,su 命令需要输入 root 用户的密码。
很明显,就安全而言,sudo 命令更好。例如,考虑到需要 root 访问权限的多用户使用的计算机。在这种情况下,使用 su 意味着需要与其他用户共享 root 用户密码,这显然不是一种好习惯。
而使用 sudo 命令就不一样了,你可以很好的处理以上的两种情况。鉴于 sudo 命令要求输入的是其他用户自己的密码,所以,不需要共享 root 密码。同时,想要阻止特定用户访问 root 权限,只需要调整 sudoers 文件中的相应配置即可。
其次,两个命令之间的另外一个区别是其默认行为。sudo 命令只允许使用提升的权限运行单个命令,而 su命令会启动一个新的 shell,同时允许使用 root 权限运行尽可能多的命令,直到明确退出登录。 因此,su 命令的默认行为是有风险的,因为用户很有可能会忘记他们正在以 root 用户身份进行工作,于是,无意中做出了一些不可恢复的更改(例如:对错误的目录运行 rm -rf 命令!)。

尽管 sudo 命令是以目标用户(默认情况下是 root 用户)的身份执行命令,但是它们会使用 sudoer 所配置的用户名来记录是谁执行命令。而 su 命令是无法直接跟踪记录用户切换到 root 用户之后执行了什么操作。

sudo 命令比 su 命令灵活很多,因为你甚至可以限制 sudo 用户可以访问哪些命令。换句话说,用户通过 sudo 命令只能访问他们工作需要的命令。而 su 命令让用户有权限做任何事情。 大概是因为使用 su 命令或直接以 root 用户身份登录有风险,所以,一些 Linux 发行版(如 Ubuntu)默认禁用 root 用户帐户。鼓励用户在需要 root 权限时使用 sudo 命令。如果你想在系统中启用 root 用户帐户(强烈反对,因为你可以使用 sudo 命令或 sudo su 命令),你必须手动设置 root 用户密码,可以使用以下命令:
sudo passwd root