Linux CentOS开启samba服务(附smb.conf手册)
Unix/LinuxC技术 jackxiang 2010-2-11 18:11
由于想在jackxiang目录下建立一个文件测试samb看看,没有想到看是看到了,一用记事本打开后保存说是找不到文件路径,最后发现时文件权限的问题,于是作如下修改:
修改为:
[root@localhost home]# chown -R jackxiang.users jackxiang/
就可以用记事本等编辑工具修改了而不提示找不到路径了。
\\192.168.63.128
然后直接点击生成的jackxiang目录,输入通过smbpasswd –a jackxiang 输入密码。
进入目录,建立文件夹等。。。注意是:user组喔,你建立文件夹可能会出现问题,所以:
-rw-rw-rw- 1 jackxiang jackxiang 18 02-12 07:55 mysambtest.txt
drwxr-xr-x 2 jackxiang jackxiang 4096 02-12 07:56 newfolder
drwxr-xr-x 2 jackxiang jackxiang 4096 02-12 07:56 newfoldertest
-rw-rw-rw- 1 jackxiang jackxiang 0 02-12 07:57 newfolder.txt
这时候才是随便建立目录和文件喽!
附:
#cd /usr/local/samba/bin
测试参数的设置格式,属性是否正确。
Samba version 3.0.10
PID Username Group Machine
-------------------------------------------------------------------
2502 root UEC uec-gcp (192.168.1.2)
Service pid machine Connected at
-------------------------------------------------------
IPC$ 2502 uec-gcp Mon Sep 12 13:11:31 2005
John docs 2502 uec-gcp Mon Sep 12 12:59:01 2005
gcp docs 2502 uec-gcp Mon Sep 12 12:58:54 2005
No locked files
添加访问的共享资源的用户,一般用户也可以访问SWAT,但只有查看状态的权限。
# smbtree
Password:
WORKGROUP
\SUN440EN Samba 3.0.10
\SUN440ENADMIN$ IPC Service (Samba 3.0.10)
\SUN440ENIPC$ IPC Service (Samba 3.0.10)
\SUN440ENjohn docs
\SUN440ENgcp docs
显示了samba server 上的共享资源。
阅读全文
-rw-r--r-- 1 root root 14 02-12 07:50 mysambtest.txt
修改为:
[root@localhost home]# chown -R jackxiang.users jackxiang/
就可以用记事本等编辑工具修改了而不提示找不到路径了。
\\192.168.63.128
然后直接点击生成的jackxiang目录,输入通过smbpasswd –a jackxiang 输入密码。
进入目录,建立文件夹等。。。注意是:user组喔,你建立文件夹可能会出现问题,所以:
[root@localhost home]# chown -R jackxiang.jackxiang jackxiang/
-rw-rw-rw- 1 jackxiang jackxiang 18 02-12 07:55 mysambtest.txt
drwxr-xr-x 2 jackxiang jackxiang 4096 02-12 07:56 newfolder
drwxr-xr-x 2 jackxiang jackxiang 4096 02-12 07:56 newfoldertest
-rw-rw-rw- 1 jackxiang jackxiang 0 02-12 07:57 newfolder.txt
这时候才是随便建立目录和文件喽!
附:
#cd /usr/local/samba/bin
#testparms
测试参数的设置格式,属性是否正确。
#smbstatus
Samba version 3.0.10
PID Username Group Machine
-------------------------------------------------------------------
2502 root UEC uec-gcp (192.168.1.2)
Service pid machine Connected at
-------------------------------------------------------
IPC$ 2502 uec-gcp Mon Sep 12 13:11:31 2005
John docs 2502 uec-gcp Mon Sep 12 12:59:01 2005
gcp docs 2502 uec-gcp Mon Sep 12 12:58:54 2005
No locked files
#smbpasswd –a username
添加访问的共享资源的用户,一般用户也可以访问SWAT,但只有查看状态的权限。
# smbtree
Password:
WORKGROUP
\SUN440EN Samba 3.0.10
\SUN440ENADMIN$ IPC Service (Samba 3.0.10)
\SUN440ENIPC$ IPC Service (Samba 3.0.10)
\SUN440ENjohn docs
\SUN440ENgcp docs
[root@localhost bin]# ./testparm
Load smb config files from /usr/local/samba/lib/smb.conf
Processing section "[homes]"
Processing section "[brutxiang]"
Processing section "[lxliu]"
Processing section "[ianzhang]"
Processing section "[guodong]"
Processing section "[kamchen]"
Load smb config files from /usr/local/samba/lib/smb.conf
Processing section "[homes]"
Processing section "[brutxiang]"
Processing section "[lxliu]"
Processing section "[ianzhang]"
Processing section "[guodong]"
Processing section "[kamchen]"
#smbclient -L yourhostname.
显示了samba server 上的共享资源。
阅读全文
我晚上睡觉的时候,经常会被自己的口水呛住了,然后就会有很多喉痰,特别不舒服,就像感冒了咳嗽那样,是怎么回事?
成年人睡眠时流口水这是因为患有神经官能症或其它引起植物神经功能紊乱的疾患,副交感神经活动相对亢进,胃肠蠕动加强,唾液及其它消化液的分泌增加,加上入睡后吞咽动作有粘膜溃疡、舌炎等疾患,由于慢性炎症的刺激,也可使唾液分泌增加。还有,睡眠时由于体位的关系,侧身睡、头偏向一侧,也容易流口水。当然,这种情况的口水流量较少。 祖国医学认为成年人流口水是脾胃功能失调的一种表现,这种情况常见于脾胃运动功能减弱、水湿停留、脾胃湿热或胃里存食下降、胃热上蒸,即所谓的“胃不和则卧不安”。 流口水怎么办呢?首先你不要有精神负担,先到正规医院去检查,要针对流口水的原发疾病予以治疗,例如神经官能症、口腔炎症等;其次,要养成良好的饮食习惯,饭后不要立即就寝,晚饭不要吃得过多或过多食用油腻、粘糯等不易消化的食物;第三,养成饭后漱口、睡前刷牙等良好的卫生习惯,以减少口腔内炎症的发生。另外,睡前也不要做剧烈的运动或过度用脑
关于大人半夜睡觉被口水呛住的问题
1、胃肠不好,尤其是胃酸分泌过多;
2、睡姿不对,尤其是仰躺;
3、睡前不要吃东西也不要太饿,侧卧姿睡觉...
咳嗽是呼吸系统中最常见的症状之一,是人体的一种保护性措施,对机体是有益的,当呼吸道粘膜受到异物、炎症、分泌物或过敏性因素等刺激时,即反射性地引起咳嗽,有助于排除自外界侵入呼吸道的异物或分泌物、消除呼吸道刺激因子
咳嗽偏方,你试试吧
1萝卜蜂蜜饮(治疗咳嗽)
用料:白萝卜5片、生姜3片、大枣3枚、蜂蜜30克。
制法服法:将萝卜、生姜、大枣加水适量煮沸约30分钟,去渣,加蜂蜜,再煮沸即可。
温热服下。每日1~2次。
功效主治:萝卜味辛、甘,性凉,有清热生津,凉血止血,化痰止咳等作用。其醇提取物对革兰氏阳性细菌有较强的抗菌作用。生姜是散风寒、止呕下气的常用药,大枣多作和胃养血及调和药物使用。蜂蜜润燥止咳,本饮可起到敬寒宣肺,祛风止咳的作用。
治疗伤风咳嗽,以风寒感冒咳嗽为宜。
注意事项:体弱屡易感冒咳嗽,久治不愈或反复迁延的婴儿,可试用。但风热咳嗽,见发热痰黄者,则不宜选用。
2百合蜜(专治:咳嗽)
用料:百合60克、蜂蜜30克。
制法服法:将百合洗净晾干,与蜂蜜拌匀,入锅隔水蒸熟。
此蜜制百合可作点心让婴儿吃。
功效主治:百合味甘、微苦,性微寒。有润肺止咳、清心安神作用。含淀粉、蛋白质、脂肪、多种生物碱、钙、磷、铁等成分。药理试验其煎剂对氨水引起的小孩咳嗽有止咳作用,并能对抗组织胺引起的蟾蛛哮喘。与蜂蜜同用,加强其润肺止咳作用。
治疗婴儿慢性支气管炎,咽干燥咳,特别是入秋之后的干咳,伴大便秘结更宜。
注意事项:脾虚便溏婴儿不宜选用。本法服食方便,以秋、冬季选用为宜。
3百合款冬花饮(专治:咳嗽 )
用料:百合30~60克、款冬花10~15克、冰糖适量。
制法服法:将上料同置砂锅中煮成糖水。
饮水食百合,宜晚饭后睡前食用。
功效主治:百合润肺止咳。款冬花辛温,有润肺下气,止咳化痰作用。本品提取液可使支气管略扩张,对组织胺引起的痉挛,有解痉作用。因此具有止咳,祛痰平喘作用。两药合用有润肺止咳、下气化痰之功效。
治疗婴儿慢性支气管炎,支气管哮喘(缓解期),秋冬咳嗽、咽喉干痛,久咳不愈。
注意事项:本饮以秋冬咳嗽,略见有痰者适宜,对支气管哮喘或痉挛性支气管炎,则药力不及,但可作辅助治疗用。
4荸荠百合羹 (专治:咳嗽 )
用料:荸荠(马蹄)30克、百合1克、雪梨l个,冰糖适量。
制法服法:将荸荠洗净去皮捣烂,雪梨洗净连皮切碎去核,百合洗净后,三者
混合加水煎煮,后加适量冰糖煮至熟烂汤稠。
温热食用。
功效主治:荸荠味甘,性微寒,能清热生津,凉血解毒,化痰消积等作用,含淀粉、蛋白质、脂肪、钙、磷、铁、维生素C和荸荠素等成分,荸荠素对金黄色葡萄球菌、大肠杆菌及绿脓杆菌有抑制作用;梨能清热生津,润燥化痰;百合润肺止咳。三者合用则起滋阴润燥,化痰止咳的作用。
治疗痰热咳嗽,痰黄稠,咽喉不利。用于婴儿慢性气管炎见痰热症者。
注意事项:脾虚便溏、咳痰清稀者不宜选用。血虚体弱的婴儿忌用。
5川贝母蒸梨(专治:咳嗽 )
用料:雪梨或鸭梨一个,川贝母6克,冰糖20克。
制法服法:将梨于柄部切开,挖空去核,将川贝母研成粉未后。装入雪梨内,用牙签将柄部复原固定。放大碗中加入冰糖,加少量水,隔水蒸半小时。
将蒸透的梨和其中的川贝母一起食入。
功效主治:贝母为化痰止咳良药,与雪梨、冰糖并用,则起化痰止咳,润肺养阴功效。
治疗久咳不愈,痰多,咽干,气短乏力。
注意事项:民间常用验方。婴儿久咳,多为慢性支气管炎,本方性味平和,对久咳体弱儿适用。复有外感者不宜用。本方以选用地道药材川贝母其效佳。
6醋饮 (专治:咳嗽 )
用料:白醋适量。
制法服法:将醋烧沸,放凉后备用。
每次服一小匙,慢慢咽之,日咽数次。
功效主治:醋味酸、甘,性平,有散瘀、解毒、消肿的功用。用治咽炎咳嗽,取其消除咽痒的功效。见患儿因痒而咳,遇风则甚。所谓“痒则咳,不能已矣”。
注意事项:此法有时可收到意想不到的功效。但对脾虚湿盛,有骨关节病痛者不宜。病愈即止,多食会损齿伤胃。
7核桃鸭子(专治:咳嗽 )
用料:核桃仁200克,荸荠150克,老鸭子1只、鸡肉泥100克、鸡蛋清(1只)。
制法服法:将鸭子宰杀,去内脏,洗净,用开水浸一遍,置盆内。加葱、姜、味精少许,上笼蒸熟,取出晾凉后,去骨,切成块。将核桃仁、荸荠研切成碎末状,与鸡肉泥、鸡蛋清,加少许湿粉共调成糊状。将糊淋在鸭膛上,下油锅炸酥,捞出、控油即成。
成年人睡眠时流口水这是因为患有神经官能症或其它引起植物神经功能紊乱的疾患,副交感神经活动相对亢进,胃肠蠕动加强,唾液及其它消化液的分泌增加,加上入睡后吞咽动作有粘膜溃疡、舌炎等疾患,由于慢性炎症的刺激,也可使唾液分泌增加。还有,睡眠时由于体位的关系,侧身睡、头偏向一侧,也容易流口水。当然,这种情况的口水流量较少。 祖国医学认为成年人流口水是脾胃功能失调的一种表现,这种情况常见于脾胃运动功能减弱、水湿停留、脾胃湿热或胃里存食下降、胃热上蒸,即所谓的“胃不和则卧不安”。 流口水怎么办呢?首先你不要有精神负担,先到正规医院去检查,要针对流口水的原发疾病予以治疗,例如神经官能症、口腔炎症等;其次,要养成良好的饮食习惯,饭后不要立即就寝,晚饭不要吃得过多或过多食用油腻、粘糯等不易消化的食物;第三,养成饭后漱口、睡前刷牙等良好的卫生习惯,以减少口腔内炎症的发生。另外,睡前也不要做剧烈的运动或过度用脑
关于大人半夜睡觉被口水呛住的问题
1、胃肠不好,尤其是胃酸分泌过多;
2、睡姿不对,尤其是仰躺;
3、睡前不要吃东西也不要太饿,侧卧姿睡觉...
咳嗽是呼吸系统中最常见的症状之一,是人体的一种保护性措施,对机体是有益的,当呼吸道粘膜受到异物、炎症、分泌物或过敏性因素等刺激时,即反射性地引起咳嗽,有助于排除自外界侵入呼吸道的异物或分泌物、消除呼吸道刺激因子
咳嗽偏方,你试试吧
1萝卜蜂蜜饮(治疗咳嗽)
用料:白萝卜5片、生姜3片、大枣3枚、蜂蜜30克。
制法服法:将萝卜、生姜、大枣加水适量煮沸约30分钟,去渣,加蜂蜜,再煮沸即可。
温热服下。每日1~2次。
功效主治:萝卜味辛、甘,性凉,有清热生津,凉血止血,化痰止咳等作用。其醇提取物对革兰氏阳性细菌有较强的抗菌作用。生姜是散风寒、止呕下气的常用药,大枣多作和胃养血及调和药物使用。蜂蜜润燥止咳,本饮可起到敬寒宣肺,祛风止咳的作用。
治疗伤风咳嗽,以风寒感冒咳嗽为宜。
注意事项:体弱屡易感冒咳嗽,久治不愈或反复迁延的婴儿,可试用。但风热咳嗽,见发热痰黄者,则不宜选用。
2百合蜜(专治:咳嗽)
用料:百合60克、蜂蜜30克。
制法服法:将百合洗净晾干,与蜂蜜拌匀,入锅隔水蒸熟。
此蜜制百合可作点心让婴儿吃。
功效主治:百合味甘、微苦,性微寒。有润肺止咳、清心安神作用。含淀粉、蛋白质、脂肪、多种生物碱、钙、磷、铁等成分。药理试验其煎剂对氨水引起的小孩咳嗽有止咳作用,并能对抗组织胺引起的蟾蛛哮喘。与蜂蜜同用,加强其润肺止咳作用。
治疗婴儿慢性支气管炎,咽干燥咳,特别是入秋之后的干咳,伴大便秘结更宜。
注意事项:脾虚便溏婴儿不宜选用。本法服食方便,以秋、冬季选用为宜。
3百合款冬花饮(专治:咳嗽 )
用料:百合30~60克、款冬花10~15克、冰糖适量。
制法服法:将上料同置砂锅中煮成糖水。
饮水食百合,宜晚饭后睡前食用。
功效主治:百合润肺止咳。款冬花辛温,有润肺下气,止咳化痰作用。本品提取液可使支气管略扩张,对组织胺引起的痉挛,有解痉作用。因此具有止咳,祛痰平喘作用。两药合用有润肺止咳、下气化痰之功效。
治疗婴儿慢性支气管炎,支气管哮喘(缓解期),秋冬咳嗽、咽喉干痛,久咳不愈。
注意事项:本饮以秋冬咳嗽,略见有痰者适宜,对支气管哮喘或痉挛性支气管炎,则药力不及,但可作辅助治疗用。
4荸荠百合羹 (专治:咳嗽 )
用料:荸荠(马蹄)30克、百合1克、雪梨l个,冰糖适量。
制法服法:将荸荠洗净去皮捣烂,雪梨洗净连皮切碎去核,百合洗净后,三者
混合加水煎煮,后加适量冰糖煮至熟烂汤稠。
温热食用。
功效主治:荸荠味甘,性微寒,能清热生津,凉血解毒,化痰消积等作用,含淀粉、蛋白质、脂肪、钙、磷、铁、维生素C和荸荠素等成分,荸荠素对金黄色葡萄球菌、大肠杆菌及绿脓杆菌有抑制作用;梨能清热生津,润燥化痰;百合润肺止咳。三者合用则起滋阴润燥,化痰止咳的作用。
治疗痰热咳嗽,痰黄稠,咽喉不利。用于婴儿慢性气管炎见痰热症者。
注意事项:脾虚便溏、咳痰清稀者不宜选用。血虚体弱的婴儿忌用。
5川贝母蒸梨(专治:咳嗽 )
用料:雪梨或鸭梨一个,川贝母6克,冰糖20克。
制法服法:将梨于柄部切开,挖空去核,将川贝母研成粉未后。装入雪梨内,用牙签将柄部复原固定。放大碗中加入冰糖,加少量水,隔水蒸半小时。
将蒸透的梨和其中的川贝母一起食入。
功效主治:贝母为化痰止咳良药,与雪梨、冰糖并用,则起化痰止咳,润肺养阴功效。
治疗久咳不愈,痰多,咽干,气短乏力。
注意事项:民间常用验方。婴儿久咳,多为慢性支气管炎,本方性味平和,对久咳体弱儿适用。复有外感者不宜用。本方以选用地道药材川贝母其效佳。
6醋饮 (专治:咳嗽 )
用料:白醋适量。
制法服法:将醋烧沸,放凉后备用。
每次服一小匙,慢慢咽之,日咽数次。
功效主治:醋味酸、甘,性平,有散瘀、解毒、消肿的功用。用治咽炎咳嗽,取其消除咽痒的功效。见患儿因痒而咳,遇风则甚。所谓“痒则咳,不能已矣”。
注意事项:此法有时可收到意想不到的功效。但对脾虚湿盛,有骨关节病痛者不宜。病愈即止,多食会损齿伤胃。
7核桃鸭子(专治:咳嗽 )
用料:核桃仁200克,荸荠150克,老鸭子1只、鸡肉泥100克、鸡蛋清(1只)。
制法服法:将鸭子宰杀,去内脏,洗净,用开水浸一遍,置盆内。加葱、姜、味精少许,上笼蒸熟,取出晾凉后,去骨,切成块。将核桃仁、荸荠研切成碎末状,与鸡肉泥、鸡蛋清,加少许湿粉共调成糊状。将糊淋在鸭膛上,下油锅炸酥,捞出、控油即成。
CGI(Common Gateway Interface): 通用网关接口
一般是可执行程序,例如EXE文件,和WEB服务器各自占据着不同的进程,而且一般一个CGI程序只能处理一个用户请求。这样,当用户请求数量非常多时,会大量占用系统的资源,如内存、CPU时间等,造成效能低下。
其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能. 传统的CGI解释器的反复加载是CGI性能低下的主要原因, 如果CGI解释器保持在内存中并接受FastCGI进程管理器调度, 则可以提供良好的性能、伸缩性等. 作为一种替代CGI的技术标准, fastCGI有如下优点(稳定,安全,高性能,方便扩展)
从稳定性上看,FastCGI是以独立的进程池运行来cgi,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分配新的进程来运行逻辑.
从安全性上看, FastCGI和宿主的server完全独立, fastcgi怎么down也不会把server搞垮,
从性能上看, FastCGI把动态逻辑的处理从server中分离出来, 大负荷的IO处理还是留给宿主server, 这样宿主server可以一心一意作IO,对于一个普通的动态网页来说, 逻辑处理可能只有一小部分, 大量的图片等静态IO处理完全不需要逻辑程序的参与
从扩展性上讲, FastCGI是一个中立的技术标准, 完全可以支持任何语言写的处理程序(php,java,python…)
php5-cgi:
PHP5的CGI方式的一大优势是内置了FastCGI的支持,只需指明绑定的地址和端口参数便可以以FastCGI的方式运行.但是如果直接使用php-cgi的FastCGI运行方式有两个问题
如果进程崩溃,难以配置重新启动
单进程的效率低
因此,我们可以借助Lighttpd的spawn-fcgi,目前版本号为1.6.0 rc1 该版本已经从lighttpd中独立发布出来.我们使用spawn-fcgi来控制php5-cgi进程的运行.
php-fpm(PHP FastCGI Process Manager):
和spawn-fcgi是一样的东西,好像将会在php5.3.2+中得到支持, http://php-fpm.org/download/
php-fpm文档中文翻译, http://syre.blogbus.com/logs/20092011.html
一般是可执行程序,例如EXE文件,和WEB服务器各自占据着不同的进程,而且一般一个CGI程序只能处理一个用户请求。这样,当用户请求数量非常多时,会大量占用系统的资源,如内存、CPU时间等,造成效能低下。
其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能. 传统的CGI解释器的反复加载是CGI性能低下的主要原因, 如果CGI解释器保持在内存中并接受FastCGI进程管理器调度, 则可以提供良好的性能、伸缩性等. 作为一种替代CGI的技术标准, fastCGI有如下优点(稳定,安全,高性能,方便扩展)
从稳定性上看,FastCGI是以独立的进程池运行来cgi,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分配新的进程来运行逻辑.
从安全性上看, FastCGI和宿主的server完全独立, fastcgi怎么down也不会把server搞垮,
从性能上看, FastCGI把动态逻辑的处理从server中分离出来, 大负荷的IO处理还是留给宿主server, 这样宿主server可以一心一意作IO,对于一个普通的动态网页来说, 逻辑处理可能只有一小部分, 大量的图片等静态IO处理完全不需要逻辑程序的参与
从扩展性上讲, FastCGI是一个中立的技术标准, 完全可以支持任何语言写的处理程序(php,java,python…)
php5-cgi:
PHP5的CGI方式的一大优势是内置了FastCGI的支持,只需指明绑定的地址和端口参数便可以以FastCGI的方式运行.但是如果直接使用php-cgi的FastCGI运行方式有两个问题
如果进程崩溃,难以配置重新启动
单进程的效率低
因此,我们可以借助Lighttpd的spawn-fcgi,目前版本号为1.6.0 rc1 该版本已经从lighttpd中独立发布出来.我们使用spawn-fcgi来控制php5-cgi进程的运行.
php-fpm(PHP FastCGI Process Manager):
和spawn-fcgi是一样的东西,好像将会在php5.3.2+中得到支持, http://php-fpm.org/download/
php-fpm文档中文翻译, http://syre.blogbus.com/logs/20092011.html
thread:略.
PthreadOSIX定义的纯用户线程,对于内河而言是不知道他存在的
lwp:内河支持的线程,LINUX中的THREAD就是于此相当.
kthread:没有用户文镜.纯粹的在内河的驱动程序中执行.注意要与LINUX中的内存守护线程象区别.
问题:
我用kthread_create方法创建了一个内核线程,在线程执行函数的末尾调用的do_exit(),这样虽然释放了大部分资源,但进程描述符应该还没有释放。
请问有没有合适的方法在我的内核模块程序里彻底删除这个线程?
请帮忙详细解释好吗
例如我这样创建一个kthread
由父进程在信号处理中执行最后的清除
do_signal->sys_wait4->release_task
而这个信号是由exit_notify->do_notify_parent发出的
kill_proc会导致内核crash掉,如果注释掉的话,kernel thread会一直处于zombie状态!
我也遇到在linux上通过php的dio_open函数调用串口出现:
不知道如何解决!
PthreadOSIX定义的纯用户线程,对于内河而言是不知道他存在的
lwp:内河支持的线程,LINUX中的THREAD就是于此相当.
kthread:没有用户文镜.纯粹的在内河的驱动程序中执行.注意要与LINUX中的内存守护线程象区别.
问题:
我用kthread_create方法创建了一个内核线程,在线程执行函数的末尾调用的do_exit(),这样虽然释放了大部分资源,但进程描述符应该还没有释放。
请问有没有合适的方法在我的内核模块程序里彻底删除这个线程?
请帮忙详细解释好吗
例如我这样创建一个kthread
struct task_struct *tsk = NULL;
int run(void *data)
{
init_completion( (struct completion *) data )
complete( (struct completion *) data );
do_exit(0);
}
void entrance()
{
struct completion cplt;
tsk = kthread_create(run, &cplt, "test_thd");
if (tsk == NULL) {
return;
}
wait_for_completion(&cplt);
// 如果我要在这个位置彻底删除上面创建的线程应该怎么办,应该添加哪些代码
return;
}
请帮忙解释好吗? 谢谢!int run(void *data)
{
init_completion( (struct completion *) data )
complete( (struct completion *) data );
do_exit(0);
}
void entrance()
{
struct completion cplt;
tsk = kthread_create(run, &cplt, "test_thd");
if (tsk == NULL) {
return;
}
wait_for_completion(&cplt);
// 如果我要在这个位置彻底删除上面创建的线程应该怎么办,应该添加哪些代码
return;
}
由父进程在信号处理中执行最后的清除
do_signal->sys_wait4->release_task
而这个信号是由exit_notify->do_notify_parent发出的
kill_proc会导致内核crash掉,如果注释掉的话,kernel thread会一直处于zombie状态!
我也遇到在linux上通过php的dio_open函数调用串口出现:
[root@localhost dio]# ps aux|grep read
root 7 0.0 0.0 0 0 ? S< 05:22 0:00 [kthread]
root 7 0.0 0.0 0 0 ? S< 05:22 0:00 [kthread]
不知道如何解决!
-rwxr-xr-x 1 www www 23045 11月 22 11:26 index.html
文件的链接数是1,这意味着只有一个文件名指向这个文件的inode。在大多数情况下,这个文件名就是文件的原始名称,例如这里的 index.html。
再给加上一个硬链接如下:
ln index.html /tmp/index_link.html
ls -lart index.html
-rwxr-xr-x 2 www www 23045 11月 22 11:26 index.html
rm -rf /tmp/index_link.html
ls -lart index.html
-rwxr-xr-x 1 www www 23045 11月 22 11:26 index.html
软连接,其实就是新建立一个文件,这个文件就是专门用来指向别的文件的(那就和windows 下的快捷方式的那个文件有很接近的意味)。软连接产生的是一个新的文件,但这个文件的作用就是专门指向某个文件的,删了这个软连接文件,那就等于不需要这个连接,和原来的存在的实体原文件没有任何关系,但删除原来的文件,则相应的软连接不可用(cat那个软链接文件,则提示“没有该文件或目录“)
硬连接是不会建立Inode的,他只是在文件原来的Inode link count域再增加 1而已,也因此硬链接是不可以跨越文件系统的。相反都是软连接会重新建立一个Inode,当然Inode的结构跟其他的不一样,他只是一个指明源文件的字符串信息,一旦删除源文件,那么软连接将变得毫无意义。而硬链接删除的时候,系统调用会检查link count的数值,如果他大于等于1,那么Inode不会被回收。因此文件的内容没有不会被删除。
硬链接实际上是为文件建一个别名,链接文件和原文件实际上是同一个文件。可以通过ls -i来查看一下,这两个文件的inode号是同一个,说明它们是同一个文件;而软链接建立的是一个指向,即链接文件内的内容是指向原文件的指针,它们是两个文件。
1.软连接可以跨文件系统,硬链接不可以;
2.软连接可以对一个不存在的文件名(filename)进行连接(当然此时如果你vi这个软连接文件,linux会自动新建一个文件名为filename的文件),硬链接不可以(其文件必须存在,inode必须存在);
3.软连接可以对目录进行连接,硬链接不可以。
其他知识:
软连接(symbolic link)又叫符号连接,这个软链接文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。
ln -s source_file softlink_file
硬链接,命令:ln -d existfile newfile 不用参数-d也可以的,如:ln existfile newfile
在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Number)。在Linux中,多个文件名指向同一索引节点是存在的(如:硬链接)
I节点(Inode) :它是UNIX内部用于描述文件特性的数据结构.我们通常称I节点为文件索引结点(信息结点).i节点 含有关于文件的大部分的重要信息,包括文件数据块在磁盘上的地址.每一个I节点有它自己的标志号,我们称为文件顺序号.I节点包含的信息 1.文件类型 2.文件属主关系 3.文件的访问权限 4.文件的时间截.
文件的链接数是1,这意味着只有一个文件名指向这个文件的inode。在大多数情况下,这个文件名就是文件的原始名称,例如这里的 index.html。
再给加上一个硬链接如下:
ln index.html /tmp/index_link.html
ls -lart index.html
-rwxr-xr-x 2 www www 23045 11月 22 11:26 index.html
rm -rf /tmp/index_link.html
ls -lart index.html
-rwxr-xr-x 1 www www 23045 11月 22 11:26 index.html
软连接,其实就是新建立一个文件,这个文件就是专门用来指向别的文件的(那就和windows 下的快捷方式的那个文件有很接近的意味)。软连接产生的是一个新的文件,但这个文件的作用就是专门指向某个文件的,删了这个软连接文件,那就等于不需要这个连接,和原来的存在的实体原文件没有任何关系,但删除原来的文件,则相应的软连接不可用(cat那个软链接文件,则提示“没有该文件或目录“)
硬连接是不会建立Inode的,他只是在文件原来的Inode link count域再增加 1而已,也因此硬链接是不可以跨越文件系统的。相反都是软连接会重新建立一个Inode,当然Inode的结构跟其他的不一样,他只是一个指明源文件的字符串信息,一旦删除源文件,那么软连接将变得毫无意义。而硬链接删除的时候,系统调用会检查link count的数值,如果他大于等于1,那么Inode不会被回收。因此文件的内容没有不会被删除。
硬链接实际上是为文件建一个别名,链接文件和原文件实际上是同一个文件。可以通过ls -i来查看一下,这两个文件的inode号是同一个,说明它们是同一个文件;而软链接建立的是一个指向,即链接文件内的内容是指向原文件的指针,它们是两个文件。
1.软连接可以跨文件系统,硬链接不可以;
2.软连接可以对一个不存在的文件名(filename)进行连接(当然此时如果你vi这个软连接文件,linux会自动新建一个文件名为filename的文件),硬链接不可以(其文件必须存在,inode必须存在);
3.软连接可以对目录进行连接,硬链接不可以。
其他知识:
软连接(symbolic link)又叫符号连接,这个软链接文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。
ln -s source_file softlink_file
硬链接,命令:ln -d existfile newfile 不用参数-d也可以的,如:ln existfile newfile
在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Number)。在Linux中,多个文件名指向同一索引节点是存在的(如:硬链接)
I节点(Inode) :它是UNIX内部用于描述文件特性的数据结构.我们通常称I节点为文件索引结点(信息结点).i节点 含有关于文件的大部分的重要信息,包括文件数据块在磁盘上的地址.每一个I节点有它自己的标志号,我们称为文件顺序号.I节点包含的信息 1.文件类型 2.文件属主关系 3.文件的访问权限 4.文件的时间截.
CSS语法 (不区分大小写) JavaScript语法 (区分大小写)
border border
border-bottom borderBottom
border-bottom-color borderBottomColor
border-bottom-style borderBottomStyle
border-bottom-width borderBottomWidth
border-color borderColor
border-left borderLeft
border-left-color borderLeftColor
border-left-style borderLeftStyle
border-left-width borderLeftWidth
border-right borderRight
border-right-color borderRightColor
border-right-style borderRightStyle
border-right-width borderRightWidth
border-style borderStyle
border-top borderTop
border-top-color borderTopColor
border-top-style borderTopStyle
border-top-width borderTopWidth
border-width borderWidth
clear clear
float floatStyle
margin margin
margin-bottom marginBottom
margin-left marginLeft
margin-right marginRight
margin-top marginTop
padding padding
padding-bottom paddingBottom
padding-left paddingLeft
padding-right paddingRight
padding-top paddingTop
颜色和背景标签和属性对照
CSS语法 (不区分大小写) JavaScript语法 (区分大小写)
background background
background-attachment backgroundAttachment
background-color backgroundColor
background-image backgroundImage
background-position backgroundPosition
background-repeat backgroundRepeat
color color
样式标签和属性对照
CSS语法 (不区分大小写) JavaScript语法 (区分大小写)
display display
list-style-type listStyleType
list-style-image listStyleImage
list-style-position listStylePosition
list-style listStyle
white-space whiteSpace
文字样式标签和属性对照
CSS语法 (不区分大小写) JavaScript语法 (区分大小写)
font font
font-family fontFamily
font-size fontSize
font-style fontStyle
font-variant fontVariant
font-weight fontWeight
文本标签和属性对照
CSS语法 (不区分大小写) JavaScript语法 (区分大小写)
letter-spacing letterSpacing
line-break lineBreak
line-height lineHeight
text-align textAlign
text-decoration textDecoration
text-indent textIndent
text-justify textJustify
text-transform textTransform
vertical-align verticalAlign
补充:
在建设网站的过程中,有时难免会要用js来控制css,其实这是十分简单的看下面的例子。
[code]html:<div id="my_div" style="background-color:red">js控制css</div>
js:document.getElementById("my_div").style.backgroundColor="red"[/code]
其实就是用style对象访问css属性,值得注意的是样式属性的写法在css里是background-color,但是在js里就是backgroundColor,一般情况是把"_"去掉,第二个字母用大写。
如果用的是外联样式表,就用currentStyle对象代替style对象。如:
document.getElementById("my_div").currentStyle.backgroundColor="red"
一个例子:
[code]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>测试了</title>
<script type="text/javascript">
function divFloatRight(e) {
e.style.backgroundColor = "#ff0000";
e.style.styleFloat = "right";//IE
e.style.cssFloat = "right";//firefox and others explorer
}
function divFloatLeft(e) {
e.style.backgroundColor = "transparent";
e.style.styleFloat = "left";
e.style.cssFloat = "left";
}
</script>
</head>
<body>
<div>
<div id="demo" style="border: dashed 1px #000000;" onmousemove="divFloatRight(this);"
onclick="divFloatLeft(this);">
JavaScript控制div的float属性,onmousemove~float:right,onclick~float:left。
</div>
</div>
</body>
</html>[/code]
border border
border-bottom borderBottom
border-bottom-color borderBottomColor
border-bottom-style borderBottomStyle
border-bottom-width borderBottomWidth
border-color borderColor
border-left borderLeft
border-left-color borderLeftColor
border-left-style borderLeftStyle
border-left-width borderLeftWidth
border-right borderRight
border-right-color borderRightColor
border-right-style borderRightStyle
border-right-width borderRightWidth
border-style borderStyle
border-top borderTop
border-top-color borderTopColor
border-top-style borderTopStyle
border-top-width borderTopWidth
border-width borderWidth
clear clear
float floatStyle
margin margin
margin-bottom marginBottom
margin-left marginLeft
margin-right marginRight
margin-top marginTop
padding padding
padding-bottom paddingBottom
padding-left paddingLeft
padding-right paddingRight
padding-top paddingTop
颜色和背景标签和属性对照
CSS语法 (不区分大小写) JavaScript语法 (区分大小写)
background background
background-attachment backgroundAttachment
background-color backgroundColor
background-image backgroundImage
background-position backgroundPosition
background-repeat backgroundRepeat
color color
样式标签和属性对照
CSS语法 (不区分大小写) JavaScript语法 (区分大小写)
display display
list-style-type listStyleType
list-style-image listStyleImage
list-style-position listStylePosition
list-style listStyle
white-space whiteSpace
文字样式标签和属性对照
CSS语法 (不区分大小写) JavaScript语法 (区分大小写)
font font
font-family fontFamily
font-size fontSize
font-style fontStyle
font-variant fontVariant
font-weight fontWeight
文本标签和属性对照
CSS语法 (不区分大小写) JavaScript语法 (区分大小写)
letter-spacing letterSpacing
line-break lineBreak
line-height lineHeight
text-align textAlign
text-decoration textDecoration
text-indent textIndent
text-justify textJustify
text-transform textTransform
vertical-align verticalAlign
补充:
在建设网站的过程中,有时难免会要用js来控制css,其实这是十分简单的看下面的例子。
[code]html:<div id="my_div" style="background-color:red">js控制css</div>
js:document.getElementById("my_div").style.backgroundColor="red"[/code]
其实就是用style对象访问css属性,值得注意的是样式属性的写法在css里是background-color,但是在js里就是backgroundColor,一般情况是把"_"去掉,第二个字母用大写。
如果用的是外联样式表,就用currentStyle对象代替style对象。如:
document.getElementById("my_div").currentStyle.backgroundColor="red"
一个例子:
[code]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>测试了</title>
<script type="text/javascript">
function divFloatRight(e) {
e.style.backgroundColor = "#ff0000";
e.style.styleFloat = "right";//IE
e.style.cssFloat = "right";//firefox and others explorer
}
function divFloatLeft(e) {
e.style.backgroundColor = "transparent";
e.style.styleFloat = "left";
e.style.cssFloat = "left";
}
</script>
</head>
<body>
<div>
<div id="demo" style="border: dashed 1px #000000;" onmousemove="divFloatRight(this);"
onclick="divFloatLeft(this);">
JavaScript控制div的float属性,onmousemove~float:right,onclick~float:left。
</div>
</div>
</body>
</html>[/code]
Linux下可以用ls –l 命令来判断文件类型,如上 图所示。可以依据第一列中的10个字符来判断。
• -rw-r—r—指明了1.txt文件是一个普通文件,1.txt和myprog04文件都是普通文件。以”-“开头的都是普通文件,而以”d”开头的是目录文件。
• brw-rw---- 指明了/dev/sda1是一个块设备(Block Device)文件。以”b”开头的文件都是块设备文件。•
• crw-rw----指明了/dev/lp0是一个字符设备(Chartacter Device)文件,以”c”开头的文件都是字符设备文件。
• srwxrwxrwx 指明了/var/lib/mysql/mysql.sock是一个socket文件。以””开头的文件都是socket文件。
• prwxr—r--指明了了mypipe 是一个管道文件。管道文件的一个属性是”p”。
• lrwxrwxrwx 指明了softlinkof1.txt 是一个软链接文件(或称符号链接文件),该文件指向了1.txt。以”l”开头的文件是软链接文件。
• -rw-r—r—开头的hard_link_of_1.txt看上去是个普通文件,但它实际上是一个硬链接文件。
• -rwsr-xr-x指明了myprog01是一个setUid的可执行文件,这是根据第四个字符”s”判断的。
• -rwxr-sr-x指明了myprog03是一个setGid的可执行文件,这是根据第七个字符中的”s”判断的。
• -rwsr-sr-x指明了myprog02是一个setUid加setGid的可执行文件,这是根据第四个和第七个字符中的”s”判断的。
• drwxrwxrwt 中的第一个”d”字指明了tmp文件是一个目录,最后一个字符”t”指明了该目录被设置了粘着位。
一、设备文件
Linux下的/dev 目录中有大量的设备文件。主要是块设备文件和字符设备文件。
块设备文件
在过去,在添加新磁盘后,往往需要手动增加块设备文件。现在通常我们不需要手动增加块设备文件,运行一下service kudzu start ,系统就会自动为您配置相应的设备。块设备的主要特点是可以随机读写,而最常见的块设备就是磁盘,如/dev/hda1 、/dev/sda2、/dev/fd0等。
字符设备文件
同块设备一样,我们一般都可以用service kudzu start命令来自动增加、删除或修改字符设备。最常见的字符设备是打印机和终端,他们可以接受字符流。
/dev/null是一个非常有用的字符设备文件,送入这个设备的所有东西都被忽略。如果将任何程序的输出结果重定向到/dev/null,则看不到任何输出信息。甚至于,您可以将某一用户的shell指向/dev/null 以禁止其登陆。
管道设备文件
管道设备文件有时候也被叫做FIFO文件(FIFO是先进先出的意思),从字面上理解,管道设备文件就是从一头流入,从另一头流出。通常我们会在其中做一些工作,以达到我们“吃的是草,挤出来的是奶”的目的,管道文件也有其妙用。
以前,Unix系统对文件的最大用量用2GB的限制,虽然现在新版本的Linux、Solaris、FreeBSD等不再有此限制,但处理大文件的需求仍然存在,假设您想用镜像(dd命令)的方式来备份一个容量为20GB分区的分区,就会产生一个20GB的文件,根据您磁盘实际的使用状况,这个文件在压缩后可能只有数MB到数GB,我们可以建立一个管道文件来自动实现这个压缩过程。
[root@linux236 root]# mknod mypipe p
[root@linux236 root]# ls -l mypipe
prw-r--r-- 1 root root 0 Aug 5 23:27 mypipe
[root@linux236 root]#
在这里,我们建立了一个叫mypipe的管道文件,用ls -l 命令可以看到它的属性是prw-r--r--,用下面的组合命令实现镜像和压缩:
[root@linux236 root]# compress < mypipe > sda6.img.Z &
[root@linux236 root]# dd if=/dev/sda6 of=mypipe
[root@linux236 root]# ls sda6.img.Z
sda6.img.Z
第一个命令使得从mypipe管道中流出的文件被压缩为sda.img.Z文件,注意这个命令的结尾必须使用"&"符号。第二个命令将/dev/sda6分区中的资料道入管道文件mypipe,换句话说,/dev/sda6分区中的数据进入管道,而压缩文件sda6.img.Z文件从管道中流出。
在导出Oracle、DB2等大型数据库时等经常会生成很大的文件,熟练的数据库管理员往往会选择通过管道进行压缩的方式,对于Oracle数据库,我们可以使用下边的组合命令:
这样,就会将Oracle导出的内容直接压缩成为expdat.dmp.Z文件。
compress < mypipe > expdat.dmp.Z &
exp userid=system file=mypipe owner=scott
第二章 链接文件
链接文件有点类似于Windows 的所谓快捷方式,但并不完全一样。链接有两种方式,软链接和硬链接。
软链接文件
软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。链接文件甚至可以链接不存在的文件,这就产生一般称之为"断链"的问题(或曰“现象"),链接文件甚至可以循环链接自己。类似于编程语言中的递归。
[yaoyao@linux236 yaoyao]$ ls -l
total 0
lrwxrwxrwx 1 yaoyao yaoyao 5 Aug 6 17:39 1.txt -> 3.txt
lrwxrwxrwx 1 yaoyao yaoyao 5 Aug 6 17:38 2.txt -> 1.txt
lrwxrwxrwx 1 yaoyao yaoyao 5 Aug 6 17:39 3.txt -> 2.txt
上面的三个文件形成了一个递归,实质上没有任何作用。系统管理员应该避免系统出现断链或循环链接。
用ln -s 命令可以生成一个软连接,如下:
[root@linux236 test]# ln -s source_file softlink_file
在对符号文件进行读或写操作的时候,系统会自动把该操作转换为对源文件的操作,但删除链接文件时,系统仅仅删除链接文件,而不删除源文件本身。
硬链接文件
info ln 命令告诉您,硬链接是已存在文件的另一个名字(A "hard link" is another name for an existing file),这多少有些令人困惑。硬连接的命令是
ln -d existfile newfile
硬链接文件有两个限制
1、不允许给目录创建硬链接;
2、只有在同一文件系统中的文件之间才能创建链接。
对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果我们删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了愿有的内容。这时,系统就“忘记”了它曾经是硬链接文件。而把他当成一个普通文件。
三、setUid、setGid文件和带粘着位的目录文件
在Linux/Unix下,有一种可执行文件被setUid,这使得任意使用者在执行该文件时,都绑定了文件拥有者的权限。就好像文件带了一把尚方宝剑一样,setUid文件通常用来提升使用者的权限.最有代表性的su命令.普通用户可以可以执行该命令,使自己升级为root。 setUid命令的用法是:
chmod 4755 your_program
setGid 文件和setUid文件非常类似,它使得这使得任意使用者在执行该文件时,都绑定了文件所有组的权限.单独setGid的文件非常少用,通常都是即 setUid又setGid。不过和您猜想的可能有点不同。setUid+setGid通常并不是用来提升权限的,而是为了绑定某个特殊用户及其组的特殊权限,例如qmail 的外围软件vpopmail,就使用了一个setUid+setGid的程序vchkpw来校验用户名和密码。这个道理和Apache常常以nobody 用户运行一样。其目的是为了更加安全。
setGid 命令的用法为
chmod 2755 your_program
通常使用命令
chmod 6755 yourprogram
来使得某可执行程序同时setUid和setGid
全能的root用户当然可以任意setUid和setGid。但尚方宝剑不能用来假传圣旨,普通用户只能给属于自己的文件配置setUid 或setGid。由于setUid或setGid文件会使普通用户提升权限,谨慎的系统管理员通常会留意系统中有setUid或setGid文件的变化。减少安全隐患。
在Linux下,/tmp是一个存放临时文件的目录,要求是对所有用户可写。但每个用户都只能删除自己拥有的文件。这种情况下,就可以把目录加一个粘着位。
[root@yaoyao /]# ls -l |grep tmp
drwsrwsrwt 9 root root 4096 8月7 10:50 tmp
注意第是个字符"t",它代表了这个目录被设置了粘着位。
我们自行建立一个abc的目录,使之具有和/tmp相同的特点
chmod 777 abc
chmod +t abc
上述的个两个命令组合等同于下边的一个命令:
chmod 1777 abc
用ls –l 看abc 目录的属性如下:
[root@yaoyao test]# ls -l
总用量 4
drwsrwsrwt 2 root root 4096 8月 7 11:32 abc
和/tmp目录相同的需求往往在ftp服务器的upload 目录中也存在。可以用相同的方式处理。
四、socket 文件
socket文件类似于管道,但它是在网络上面工作的。您到计算机就是靠它来做网络处理的。您可能听说过“Winsock”,那是 Windows 的套接口。我们在这里不深入谈有关套接口,因为如果您不写程序,您不会用到它,但如果您看到您系统里有个文件类型是s,您知道它是什么就行了。
比如说mysql 运行的时候通常会产生一个socket文件。
[root@yaoyao tmp]# ls -l /tmp/mysql.sock
srwxrwxrwx 1 mysql mysql 08月 7 10:03 mysql.sock
/tmp目录下还有一些socket文件,多半是运行Xwindows的时候产生的。
五、疑难杂症--删除不掉的文件
“为什么有些文件以讨厌的减号("-")开头做文件名,无论如何都删除不掉,这到底为什么?",您可能听过您临桌的新手这样的叫喊过,希望同样的事情不会发生在您的身上,这个非常容易解决,您只要用带路径的方法就可以把他们删除了,假定一个文件名为"-abc",您可以用:
rm ./-abc 或者
rm /home/yaoyao/-abc
命令将其轻松删除,另外您也可以用相同的方式用vi或者其他工具对他们进行修改。
另一些文件看上去可能一切正常,但当您尝试删除的时候,居然也会报错,就象下边一样:
[root@linux236 root]# ls -l 1.txt
-rw-r--r-- 1 root root 0 Aug 5 23:00 1.txt
[root@linux236 root]# rm -rf 1.txt
rm: cannot unlink `1.txt': Operation not permitted
您是全能root用户,居然系统告诉您操作不允许,是Linux疯了么?当然不是,如果您会用lsattr命令,问题就有了答案。
[root@linux236 root]# lsattr
---i---------- ./1.txt
-------------- ./weiqi.ldif
-------------- ./qi.schema
秘密终于暴露了,在lsattr命令下,这个1.txt文件带有一个"i"的属性,所以才不可以删除。您现在可以用下边的一系列命令:
[root@linux236 root]# lsattr 1.txt
---i---------- 1.txt
[root@linux236 root]# chattr -i 1.txt
[root@linux236 root]# rm -rf 1.txt
[root@linux236 root]#
成功了,这个属性专门用来保护重要的文件不被删除,通常的情况下,懂得用这几个命令的通常系统管理员有能力判断这个文件是否可以被删除。 如果您想给一个文件多加点保护,可以使用下边的命令:
chattr +i filename
命令,这样一来,想要删除这个文件就要多一个步骤。同时,这样的文件也是不可以编辑和修改的。只有root用户才能使用chattr命令。此命令可以在Linux ext2或ext3系统上使用。
类似于Dos和Windows文件系统,不能随意删除的文件多半都有其道理,即使您知道如何删除,都应该三思而后行。
总结
Linux/Unix系统管理是个复杂的工作,掌握和理解Linux/Unix文件类型是必备的基础之一。学习Linux/Unix没有捷径,必需通过大量的实践和努力学习。
• -rw-r—r—指明了1.txt文件是一个普通文件,1.txt和myprog04文件都是普通文件。以”-“开头的都是普通文件,而以”d”开头的是目录文件。
• brw-rw---- 指明了/dev/sda1是一个块设备(Block Device)文件。以”b”开头的文件都是块设备文件。•
• crw-rw----指明了/dev/lp0是一个字符设备(Chartacter Device)文件,以”c”开头的文件都是字符设备文件。
• srwxrwxrwx 指明了/var/lib/mysql/mysql.sock是一个socket文件。以””开头的文件都是socket文件。
• prwxr—r--指明了了mypipe 是一个管道文件。管道文件的一个属性是”p”。
• lrwxrwxrwx 指明了softlinkof1.txt 是一个软链接文件(或称符号链接文件),该文件指向了1.txt。以”l”开头的文件是软链接文件。
• -rw-r—r—开头的hard_link_of_1.txt看上去是个普通文件,但它实际上是一个硬链接文件。
• -rwsr-xr-x指明了myprog01是一个setUid的可执行文件,这是根据第四个字符”s”判断的。
• -rwxr-sr-x指明了myprog03是一个setGid的可执行文件,这是根据第七个字符中的”s”判断的。
• -rwsr-sr-x指明了myprog02是一个setUid加setGid的可执行文件,这是根据第四个和第七个字符中的”s”判断的。
• drwxrwxrwt 中的第一个”d”字指明了tmp文件是一个目录,最后一个字符”t”指明了该目录被设置了粘着位。
一、设备文件
Linux下的/dev 目录中有大量的设备文件。主要是块设备文件和字符设备文件。
块设备文件
在过去,在添加新磁盘后,往往需要手动增加块设备文件。现在通常我们不需要手动增加块设备文件,运行一下service kudzu start ,系统就会自动为您配置相应的设备。块设备的主要特点是可以随机读写,而最常见的块设备就是磁盘,如/dev/hda1 、/dev/sda2、/dev/fd0等。
字符设备文件
同块设备一样,我们一般都可以用service kudzu start命令来自动增加、删除或修改字符设备。最常见的字符设备是打印机和终端,他们可以接受字符流。
/dev/null是一个非常有用的字符设备文件,送入这个设备的所有东西都被忽略。如果将任何程序的输出结果重定向到/dev/null,则看不到任何输出信息。甚至于,您可以将某一用户的shell指向/dev/null 以禁止其登陆。
管道设备文件
管道设备文件有时候也被叫做FIFO文件(FIFO是先进先出的意思),从字面上理解,管道设备文件就是从一头流入,从另一头流出。通常我们会在其中做一些工作,以达到我们“吃的是草,挤出来的是奶”的目的,管道文件也有其妙用。
以前,Unix系统对文件的最大用量用2GB的限制,虽然现在新版本的Linux、Solaris、FreeBSD等不再有此限制,但处理大文件的需求仍然存在,假设您想用镜像(dd命令)的方式来备份一个容量为20GB分区的分区,就会产生一个20GB的文件,根据您磁盘实际的使用状况,这个文件在压缩后可能只有数MB到数GB,我们可以建立一个管道文件来自动实现这个压缩过程。
[root@linux236 root]# mknod mypipe p
[root@linux236 root]# ls -l mypipe
prw-r--r-- 1 root root 0 Aug 5 23:27 mypipe
[root@linux236 root]#
在这里,我们建立了一个叫mypipe的管道文件,用ls -l 命令可以看到它的属性是prw-r--r--,用下面的组合命令实现镜像和压缩:
[root@linux236 root]# compress < mypipe > sda6.img.Z &
[root@linux236 root]# dd if=/dev/sda6 of=mypipe
[root@linux236 root]# ls sda6.img.Z
sda6.img.Z
第一个命令使得从mypipe管道中流出的文件被压缩为sda.img.Z文件,注意这个命令的结尾必须使用"&"符号。第二个命令将/dev/sda6分区中的资料道入管道文件mypipe,换句话说,/dev/sda6分区中的数据进入管道,而压缩文件sda6.img.Z文件从管道中流出。
在导出Oracle、DB2等大型数据库时等经常会生成很大的文件,熟练的数据库管理员往往会选择通过管道进行压缩的方式,对于Oracle数据库,我们可以使用下边的组合命令:
这样,就会将Oracle导出的内容直接压缩成为expdat.dmp.Z文件。
compress < mypipe > expdat.dmp.Z &
exp userid=system file=mypipe owner=scott
第二章 链接文件
链接文件有点类似于Windows 的所谓快捷方式,但并不完全一样。链接有两种方式,软链接和硬链接。
软链接文件
软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。链接文件甚至可以链接不存在的文件,这就产生一般称之为"断链"的问题(或曰“现象"),链接文件甚至可以循环链接自己。类似于编程语言中的递归。
[yaoyao@linux236 yaoyao]$ ls -l
total 0
lrwxrwxrwx 1 yaoyao yaoyao 5 Aug 6 17:39 1.txt -> 3.txt
lrwxrwxrwx 1 yaoyao yaoyao 5 Aug 6 17:38 2.txt -> 1.txt
lrwxrwxrwx 1 yaoyao yaoyao 5 Aug 6 17:39 3.txt -> 2.txt
上面的三个文件形成了一个递归,实质上没有任何作用。系统管理员应该避免系统出现断链或循环链接。
用ln -s 命令可以生成一个软连接,如下:
[root@linux236 test]# ln -s source_file softlink_file
在对符号文件进行读或写操作的时候,系统会自动把该操作转换为对源文件的操作,但删除链接文件时,系统仅仅删除链接文件,而不删除源文件本身。
硬链接文件
info ln 命令告诉您,硬链接是已存在文件的另一个名字(A "hard link" is another name for an existing file),这多少有些令人困惑。硬连接的命令是
ln -d existfile newfile
硬链接文件有两个限制
1、不允许给目录创建硬链接;
2、只有在同一文件系统中的文件之间才能创建链接。
对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果我们删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了愿有的内容。这时,系统就“忘记”了它曾经是硬链接文件。而把他当成一个普通文件。
三、setUid、setGid文件和带粘着位的目录文件
在Linux/Unix下,有一种可执行文件被setUid,这使得任意使用者在执行该文件时,都绑定了文件拥有者的权限。就好像文件带了一把尚方宝剑一样,setUid文件通常用来提升使用者的权限.最有代表性的su命令.普通用户可以可以执行该命令,使自己升级为root。 setUid命令的用法是:
chmod 4755 your_program
setGid 文件和setUid文件非常类似,它使得这使得任意使用者在执行该文件时,都绑定了文件所有组的权限.单独setGid的文件非常少用,通常都是即 setUid又setGid。不过和您猜想的可能有点不同。setUid+setGid通常并不是用来提升权限的,而是为了绑定某个特殊用户及其组的特殊权限,例如qmail 的外围软件vpopmail,就使用了一个setUid+setGid的程序vchkpw来校验用户名和密码。这个道理和Apache常常以nobody 用户运行一样。其目的是为了更加安全。
setGid 命令的用法为
chmod 2755 your_program
通常使用命令
chmod 6755 yourprogram
来使得某可执行程序同时setUid和setGid
全能的root用户当然可以任意setUid和setGid。但尚方宝剑不能用来假传圣旨,普通用户只能给属于自己的文件配置setUid 或setGid。由于setUid或setGid文件会使普通用户提升权限,谨慎的系统管理员通常会留意系统中有setUid或setGid文件的变化。减少安全隐患。
在Linux下,/tmp是一个存放临时文件的目录,要求是对所有用户可写。但每个用户都只能删除自己拥有的文件。这种情况下,就可以把目录加一个粘着位。
[root@yaoyao /]# ls -l |grep tmp
drwsrwsrwt 9 root root 4096 8月7 10:50 tmp
注意第是个字符"t",它代表了这个目录被设置了粘着位。
我们自行建立一个abc的目录,使之具有和/tmp相同的特点
chmod 777 abc
chmod +t abc
上述的个两个命令组合等同于下边的一个命令:
chmod 1777 abc
用ls –l 看abc 目录的属性如下:
[root@yaoyao test]# ls -l
总用量 4
drwsrwsrwt 2 root root 4096 8月 7 11:32 abc
和/tmp目录相同的需求往往在ftp服务器的upload 目录中也存在。可以用相同的方式处理。
四、socket 文件
socket文件类似于管道,但它是在网络上面工作的。您到计算机就是靠它来做网络处理的。您可能听说过“Winsock”,那是 Windows 的套接口。我们在这里不深入谈有关套接口,因为如果您不写程序,您不会用到它,但如果您看到您系统里有个文件类型是s,您知道它是什么就行了。
比如说mysql 运行的时候通常会产生一个socket文件。
[root@yaoyao tmp]# ls -l /tmp/mysql.sock
srwxrwxrwx 1 mysql mysql 08月 7 10:03 mysql.sock
/tmp目录下还有一些socket文件,多半是运行Xwindows的时候产生的。
五、疑难杂症--删除不掉的文件
“为什么有些文件以讨厌的减号("-")开头做文件名,无论如何都删除不掉,这到底为什么?",您可能听过您临桌的新手这样的叫喊过,希望同样的事情不会发生在您的身上,这个非常容易解决,您只要用带路径的方法就可以把他们删除了,假定一个文件名为"-abc",您可以用:
rm ./-abc 或者
rm /home/yaoyao/-abc
命令将其轻松删除,另外您也可以用相同的方式用vi或者其他工具对他们进行修改。
另一些文件看上去可能一切正常,但当您尝试删除的时候,居然也会报错,就象下边一样:
[root@linux236 root]# ls -l 1.txt
-rw-r--r-- 1 root root 0 Aug 5 23:00 1.txt
[root@linux236 root]# rm -rf 1.txt
rm: cannot unlink `1.txt': Operation not permitted
您是全能root用户,居然系统告诉您操作不允许,是Linux疯了么?当然不是,如果您会用lsattr命令,问题就有了答案。
[root@linux236 root]# lsattr
---i---------- ./1.txt
-------------- ./weiqi.ldif
-------------- ./qi.schema
秘密终于暴露了,在lsattr命令下,这个1.txt文件带有一个"i"的属性,所以才不可以删除。您现在可以用下边的一系列命令:
[root@linux236 root]# lsattr 1.txt
---i---------- 1.txt
[root@linux236 root]# chattr -i 1.txt
[root@linux236 root]# rm -rf 1.txt
[root@linux236 root]#
成功了,这个属性专门用来保护重要的文件不被删除,通常的情况下,懂得用这几个命令的通常系统管理员有能力判断这个文件是否可以被删除。 如果您想给一个文件多加点保护,可以使用下边的命令:
chattr +i filename
命令,这样一来,想要删除这个文件就要多一个步骤。同时,这样的文件也是不可以编辑和修改的。只有root用户才能使用chattr命令。此命令可以在Linux ext2或ext3系统上使用。
类似于Dos和Windows文件系统,不能随意删除的文件多半都有其道理,即使您知道如何删除,都应该三思而后行。
总结
Linux/Unix系统管理是个复杂的工作,掌握和理解Linux/Unix文件类型是必备的基础之一。学习Linux/Unix没有捷径,必需通过大量的实践和努力学习。
你输入的一定是“rm -fr jakarta/”
所以才提示你“rm: cannot remove `jakarta/': Not a directory”
换用“rm -fr jakarta”就应该没问题了
rm jakarta
不要加-fr ,也不要加/
来源:http://linux.chinaunix.net/bbs/viewthread.php?tid=668717
所以才提示你“rm: cannot remove `jakarta/': Not a directory”
换用“rm -fr jakarta”就应该没问题了
rm jakarta
不要加-fr ,也不要加/
来源:http://linux.chinaunix.net/bbs/viewthread.php?tid=668717
最近在项目中使用了jQuery的BlockUI觉得还不错哦,推荐给广大奋斗在第一线的兄弟们:
如果在项目中你想要点击一个按钮使得页面背景变色然后你事先写好的div什么的显示就可以用以下语句
记得在使用这个插件的时候注意要引入两个js文件
如果你想获得更多的关于BlockUI的知识就去他的官方看一下吧,里面有好多例子大家可以照猫画虎。
如果在项目中你想要点击一个按钮使得页面背景变色然后你事先写好的div什么的显示就可以用以下语句
function showCategoryForm(){
$.blockUI({message:$('#whyForm')});(whyForm是div的id)
$('.blockOverlay').click($.unblockUI);
}
下面的语句是页面恢复: $.blockUI({message:$('#whyForm')});(whyForm是div的id)
$('.blockOverlay').click($.unblockUI);
}
function unblock(){
$.unblockUI();
}
$.unblockUI();
}
记得在使用这个插件的时候注意要引入两个js文件
<script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery.blockUI.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-1.3.2.min.js"></script>
如果你想获得更多的关于BlockUI的知识就去他的官方看一下吧,里面有好多例子大家可以照猫画虎。
sudoers—一个关于哪些用户可以执行哪些命令的列表
描述
sudoers配置文件由两种内容组成:别名(基本变量)和用户说明(user specification)(定义了谁能运行什么).sudoers的语法将在下面用扩展的巴科斯-诺尔范式(Extended Backus-Naur Form,EBNF)描述.如果您不知道什么是EBNF是什么的话也请不要放弃,事实上它很简单,并且下面用它作的定义都是经过注释的.
EBNF的快速指导
EBNF是用来描述某种语言的语法的一种简洁且精确的方法.每一个EBNF定义都是由”production rules”这种形式组成的.例如:
symbol ::= definition | alternate1 |alternate2 ………..
每一个”production rule”都和其它的”production rule”有关联,这样就构成了这种语言的语法.EBNF也包含了下面的操作符,许多读者都能够认出这是正则表达式(regular expression)的符号.但是,不要把它们和通配符(wildcard0搞混淆了.它们有着不同的含义.
? 意味着前面的一个记号(symbol)或者一组记号(group of symbol)是可选的,也就是说,可以出现一次或根本就不出现
* 在前面的一个或者一组记号出现零次或多次
+ 在前面的一个或者一组记号出现一次或多次
括号可以用来把记号组合在一起(to group symbols together),单引号可以把一个字符串按照他的字面意思来解释(这与记号的名字相反).
别名
有四种别名:User_Alias,Runas_Alias,Host_Alias和Cmnd_Alias.
Alias ::= User_Alias User_Alias (: User_Alias)* |
Runas_Alias Runas_Alias (: Runas_Alias)* |
Host_Alias Host_Alias (: Host_Alias)* |
Cmnd_Alias Cmnd_Alias (: Cmnd_Alias)*
User_Alias ::= >Runas_Alias ::= >Host_Alias ::= >Cmnd_Alias ::= >NAME ::= [A-Z]([A-Z][0-9]_)*
每一个别名都是按这种形式定义的:
Alias_Type item2, ………………..
这里Alias_Type是User_Alias,Runas_Alias,Host_Alias,Cmnd_Alias中的一个,NAMEW是一个由大写字母,数字和下划线组成的字符串,并且它必需以一个大写字母开头.可以把同一类型的多个别名定义放在同一行里,中间以一个冒号隔开.例如:
Alias_Type item2, item3 : item5
一个组成合法别名成员的定义紧随其后.(The definitions of what constitutes a valid alias member follow.)
User_List ::= User |
User , User_List
User ::= !* username |
!* %group |
!* +netgroup |
!* User_Alias
(译注:这里应该是
User_List ::= User |
User , User_List
User ::= !* username |
!* #uids |
!* %group |
!* +netgroup |
!* User_Alias
才对)
一个User_List是由一个或多个用户名,用户ID(要加上”#”前缀),系统用户组(要加上”%”前缀),网络组(要加上”+”前缀)或者其它 User_Alias组成.每一个列表项都可以加上一个或多个”!”前缀.奇数个”!”使这个列表项取反,偶数个”!”没有任何作用.(译注:这里的”! “也就是取反啦)
Runas_List ::= Runas_User |
Runas_User , Runas_List
Runas_User ::= !* username |
!* #uid |
!* %group |
!* +netgroup |
!* Runas_Alias
Runas_List和User_List是很相象的,仅仅是用Runas_Aliases替代了User_Aliases
Host_List ::= Host |
Host , Host_List
Host ::= !* hostname |
!* ip_addr |
!* network(/netmask)? |
!* +netgroup |
!* Host_Alias
Host_List 是由一个或者多个主机名,IP地址,网络号,网络组(要加上”+”前缀)或者其他的Host_Alias组成的.同样的,一个列表项的值也可以用”!”来取消.如果您使用了一个网络号但是没有随之指定子网掩码,那么主机的以太网接口的子网掩码将被使用—–如果它能够相配的话.子网掩码可以用点分十进制表示法来指定(如:255.255.255.0),也可以用CIDR(无类型域间选路)表示法指定(采用掩码中1的为数,如:24.这和前面的 255.255.255.0是等价的).主机名可以包含shell风格的通配符(请查看下面的”通配符”一节),但是除非您机器上的hostname命令能返回完整的主机名,为了使通配符有效您需要使用fqdn选项(见下面的”标志”小节)
Cmnd_List ::= Cmnd |
Cmnd , Cmnd_List
commandname ::= filename |
filename args |
filename “”
Cmnd ::= !* commandname |
!* directory |
!* Cmnd_Alias
Cmnd_List 是由一个或多个命令名,目录或者其他Cmnd_Alias组成的列表.命令名是一个可以包含shell风格通配符(请查看下面的”通配符”一节)的完整文件名.一个简单的文件名永许用户以任何他们想使用的参数来执行命令.但是您也可以指定命令行参数(可以包含通配符).您还可以通过交替的使用” “来说明这个命令执行时不能带任何命令行参数.当您在Cmnd_List中指定了一个目录时,用户将可以执行这个目录中的任何文件(不包括子目录中的文件).
如果Cmnd关联上了命令行参数,那么用户在命令行上所给的参数必需精确的匹配Cmnd中的参数(或者要和通配符匹配).注意,如果下面的字符在命令参数中出现的话,必须使用”\”来将其转义: ,, :, =, .
默认项
通过一个或多个Default_Entry行,一些特定的配置选项在运行时可以从它们的默认值改变.(译注:好拗口哦:p)这些选项可以对在任何主机上的所有用户或者在某个特定主机上的所有用户或者仅仅是一个特定的用户产生作用.如果多个条目都匹配,那么它们会按顺序执行.如果有冲突的值,那么最后一个匹配行上的值将会产生作用.
Default_Type ::= Defaults ||
Defaults : User ||
Defaults @ Host
Default_Entry ::= Default_Type Parameter_List
Parameter ::= Parameter = Value ||
Parameter += Value ||
Parameter -= Value ||
!* Parameter ||
Parameters 可以是标志(flags),整数值(integer values),字符串(strings)或者列表(lists).标志是一个布尔值,可以通过使用”!”操作符来取反.一些整数,字符串和列表参数也可以在布尔上下文中使用以使其取反.由多个单词组成的值必须用双引号引起来.一些特殊字符必须用”\”转义.
列表还有两个附加的操作符,+=和-=.这两个操作符被分别用来从一个列表中增加或删除条目.用”-=”操作符从列表中删除不存在的项目并不算是错误.
注意,由于sudoers文件是按顺序解析的,所以放置Default段的最佳位置是在Host,User和Cmnd别名段之后,用户定义段之前.
标志
long_otp_prompt
When validating with a One Time Password scheme (S/Key or OPIE), a two-line prompt is used to make it easier to cut and paste the challenge to a local window. Its not as pretty as the default but some people find it more convenient. This flag is off by default.
(译注:这一段我还没读懂,贴原文上来吧)
ignore_dot
如果设置(为on)的话,sudo将会忽略PATH环境变量中的.或者(就是当前目录).PATH本身不会被修改.这个标志默认是on.
mail_always
每当有用户使用sudo时就给mailto user发送一封邮件.此标志默认是off.
mail_badpass
当用户使用sudo但是却输入了错误的口令时将给mailto user发送一封邮件.此标志默认是off.
mail_no_user
如果使用sudo的用户在sudoers中没有记录的话将给mailto user发送一封邮件.此标志默认为on.
mail_no_host
如果使用sudo的用户在sudoers中有记录,但是他不被永许在正在使用的主机上使用sudo,将给mailto user(请查看”可以用在布尔上下文中的字符串”一节)发送一封邮件.此标志默认为off.
mail_no_perms
如果用户有使用sudo的权限,但是他试图用sudo使用的命令在sudoers中没有列出来,那么给mailto user发送一封邮件.此标志默认为off.
tty_tickets
如果设置(为on)的话,用户必须使用基于终端(tty)的的验证方法.一般的,sudo在ticket dir里使用一个与执行sudo的用户同名的目录.这个标志设置后,sudo将在那个目录中使用一个与执行sudo的用户登录tty同名的文件.此标志默认为on.
lecture
如果设置(为on)的话,初次使用sudo的用户将收到一个简短的lecture.此标志默认为on.
authenticate
如果设置(为on)的话,用户在用sudo执行命令之前必须通过口令(或者通过其他的方式)来验证身分.这个默认选项可以通过设置PASSWD和NOPASSWD标签(tags)来覆盖.此标志默认为on.
root_sudo
如果设置(为on)的话,root也将被永许使用sudo.将此标志设置为off来阻值用户通过使用类似于”sudo sudo /bin/sh”这样的连锁sudo命令来获得一个root权限的shell.此标志默认为on.
log_host
如果设置(为on)的话,主机名将被记录在sudo的日志文件(不是系统日志)中.此标志默认为off.
log_year
如果设置(为on)的话,四位的年份将被记录在sudo的日志文件(不是系统日志)中).此标志默认为off.
shell_noargs
如果设置(为on)并且sudo并未带任何参数执行的话,sudo的表现就象是带-s选项一样.也就是说,将会以root身分运行一个shell(如果 SHELL环境变量被设置的话,这个shell就是SHELL定义的shell,否则,将运行用户/etc/passwd中项的shell字段定义的 shell).此标志默认为off.
set_home
如果设置(为on)并且sudo是带-s选项执行的话,HOME环境变量将被设置为目标用户(target user)(除非sudo使用了-u选项,目标用户就是root)的主目录.这实际上使-s选项包含了-H选项.此标志默认为off.
always_set_home
如果设置(为on)的话,sudo将把HOME环境变量设置为目标用户(target user)(除非sudo使用了-u选项,目标用户就是root)的主目录.这实际上意味着-H选项总是被包含.此标志默认是off.
path_info
一般来说,如果一个命令不能在PATH环境变量中找到的话,sudo将会告诉用户.但是某些站点可能会希望禁止这个特性.因为这可以用来收集一些关于普通用户没有权限执行的命令的位置的信息.不利之处在于,如果命令只是不在用户的PATH中的话,sudo将告诉用户他们不被永许执行这些命令,这可能会把人高糊涂.此标志默认是off.
preserve_groups
默认地,sudo会初始化目标用户(target user)所在组列表的组向量(译注:原文是By default sudo will initialize the group vector to the list of groups the target user is in.)preserve_groups设置后,用户已存在的组向量将被保存不变.真实组ID和有效组ID仍然会被设置与目标用户相匹配.此标志默认是 off,
fqdn
如果您想在sudoers中使用完整主机名的话,请设置此项.例如:使用myhost.mydomain.edu来替代 myhost.设置后如果原意的话您也可以使用短格式(甚至把两种格式混合起来使用).注意,打开fqdn标志需要让sudo进行DNS解析,而如果 DNS停止工作(例如机器没有连入网络)的话会导致sudo无法使用.同时需要注意的是,您必须使用DNS知道的主机正式名称,也就是说您不能使用主机的别名(CNAME entry),因为您无法从DNS处得到所有的别名.如果您机器的主机名(就是hostname命令的输出)已经是完整格式,您就不需要设置fqdn.此标志默认是off.
insults
如果设置(为on)的话,sudo将会侮辱(insult)输入错误口令的用户(译注:这也可以?:p).此标志默认为off.
requiretty
如果设置(为on)的话,sudo仅仅在用户从一个真正的tty上登录时才会执行.这将不永许像”rsh somehost sudo ls”这样的命令,因为rsh并不分配一个tty.因为当没有tty存在时无法关闭echo,所以一些站点可能会希望设置这个标志来阻止用户输入可见(回显)的口令.此标志默认为off.
env_editor
如果设置(为on)的话,visudo将使用在EDITOR或者VISUAL环境变量中定义的编辑器,如果EDITOR和VISUAL都没有定义的话将使用默认的编辑器列表.注意,这可能造成一个安全漏洞,因为这永许用户以root身份运行任意的命令而不被日志记录.一个安全的变通方法是在editor(见下面的”字符串”小节)中保存一个用冒号分隔的编辑器列表.这样visudo将仅仅使用EDITOR或者VISUAL中定义的编辑器—–如果它们和editor列表中的某个项目匹配的话.
rootpw
如果设置(为on)的话,sudo将提示输入root的口令而不是执行sudo命令的用户的口令.此标志默认为off.
runaspw
如果设置(为on)的话,sudo将提示输入由runsa_default选项定义的用户(默认为root)的口令而不是执行sudo命令的用户的口令.此标志默认为off.
targetpw
如果设置(为on)的话,sudo将提示输入由sudo的-u选项指定的用户(默认为root)的口令而不是执行sudo的用户的口令.此标志默认为off.
set_logname
一般地,sudo将把LOGNAME和USER环境变量设置为目标用户(除非使用了-u选项的话,就是root)的名字.但是,因为一些程序(包括RCS版本控制系统)使用LOGNAME来确认用户的真实身份,它可能想要改变这种行为,这可以通过取消set_logname选项来实现.
stay_setuid
一般地,当sudo执行一个命令时,真实UID和有效UID都被设置为目标用户(默认是root)的UID.这个选项改变了这种行为,它把真实UID保留为执行sudo的用户的UID.换句话说,这使sudo成为了一个setuid程序.这在那些当setuid程序运行时禁用一些有潜在危险的功能的系统上会很有用.尽管如此,请注意这意味着sudo运行时的真实UID将是执行sudo命令的用户的UID,这可能会允许用户在能够在日志中记录下一个 failure之前杀死sudo,这倚赖于您的操作系统如何定义信号和setuid进程之间的相互作用.
env_reset
如果设置(为 on)的话,sudo将把环境重置为只包含下列变量:HOME,LOGNAME,PATH,SHELL,TERM和USER(此外还有SUDO_*).在这些变量中,只有TERM保留原环境中的值不变,其他的变量都被设置为默认值(值可能被set_logname选项修改).如果sudo编译时加入了 SECURE_PATH选项,它的值将被作为PATH环境变量的值.其他的变量可以由设置env_keep选项来保存.
use_loginclass
设置(为on)的话,sudo将执行对目标用户的登录类指定的默认动作—-如果存在的话.此选项仅仅在sudo配置时带有–with-logincap选项时才存在.此标志默认是off.
整数
passwd_tries
sudo向日志中写入一个failure并退出之前允许用户输入口令的次数,默认为3.
可以用在布尔上下文中的整数(integers that can be used in a boolean context)
loglinelen
日志文件每行中的字母数.这个值用来决定日志文件中什么时候折行.这个选项仅影响sudo的日志,而对系统日志文件没有影响.默认值为80(使用0或者取消此选项来禁止折行).
timestamp_timeout
sudo再次询问口令之前逝去的时间(以分钟记).默认值为5.如果想要总是询问口令的话请把此值设置为0.如果设置为负数的话,用户的时间戳永远不会过期.这可以用来允许用户分别使用sudo -v和sudo -k来建立或者删除他们自己的时间戳.
passwd_timeout
sudo的口令询问超时时间(分钟记).默认为5.设置为0可以取消口令超时.
umask
执行命令时使用的umask值.要保留用户的umask值的话请取消此选项或者设置为0777.此选项的默认值为0022.
字符串
mailsub
发送给mailto user的邮件使用的主题.转义字符%h将被扩展为机器的主机名.默认值为”*** SECURITY information for %h ***”.
badpass_message
当用户输入了错误的口令时显示的信息.除非设置了insults的话,默认值将为”Sorry, try again.”
timestampdir
sudo存储时间戳文件的目录.默认值为/var/run/sudo
passprompt
询问口令时的提示.可以被sudo的-p选项或者SUDO_PROMPT环境变量所覆盖.这里提供了两个转义字符:%u将被扩展为用户的登录名,而%h将被扩展为本地主机名.此选项的默认值为”Password:”.
runas_default
使用sudo但没有指定-u标志时使用的默认用户.默认为root
syslog_goodpri
用户身份验证成功时使用的系统日志优先级.默认为notice
syslog_badpri
用户身份验证成功时使用的系统日志优先级.默认为alert
editor
用冒号分隔开的一个允许visudo使用的编辑器列表.可能的话visudo将选择使用和用户的USER环境变量相匹配的那个编辑器,或者是列表中的第一个存在且可执行的编辑器.默认值为您系统中vi编辑器的路径.
可以用在布尔上下文中的字符串(strings that can used in a boolean context)
logfile
sudo日志(不是系统日志)的存放位置.设置一个路径来打开日志功能,取消设置将关闭日志功能.(Seting a path turns on logging to a file; negating this option turns it off.)
syslog
如果起用了syslog的话将使用的系统日志设施(取消此选项来禁用系统日志记录)(译注:原文为:Syslog facility if syslog is being used for logging (negate to disable syslog logging)).默认为arthpriv.
mailerpath
用来发送报警邮件的邮件程序的路径.默认值是sendmail的路径.
mailerflags
使用邮件程序时的标记,默认为 -t.
mailto
发送报警邮件和错误邮件的目的地址.这个地址必须用双引号引起来,以免sudo解释”@”符号.默认值为root.
exempt_group
在此组中的用户将不要求口令和PATH.此选项默认没有设置.
verifypw
此选项控制当用户使用带有-v选项的sudo时,何时要求口令.它可以有下面可能的值:
all:当前主机上sudoers中所有的用户条目都必须设置NOPASSWD标志来避免输入口令.
any:当前主机上sudoers中至少有一个用户条目必须设置NOPASSWD标志来避免输入口令.
never:用户使用-v标志但从不需要输入口令.
always:用户使用-v标志但总是需要输入口令.
默认的值是”all”.
listpw
此选项控制当用户使用带有-l选项的sudo时,何时要求口令.它可以有下面可能的值:
all:[/size当前主机上sudoers中所有的用户条目都必须设置NOPASSWD标志来避免输入口令.
any:当前主机上sudoers中至少有一个用户条目必须设置NOPASSWD标志来避免输入口令.
never:用户使用-l标志但从不需要输入口令.
always:用户使用-l标志但总是需要输入口令.
默认值为"any".
可以在布尔上下文中使用的列表(lists that can be used in a boolean context)
env_check
如果含有"%"或者"/"字符的话将从用户的环境中删除的环境变量.这将预防拙劣的程序中printf风格的格式所带来的伤害.这个参数可以是一个用双引号引起,由空格分隔的列表,或者是一个不带引号的单值.这个列表可以通过分别使用"=",+=","-=","!"来重写,增添,删除或取反.当以root 身份执行带-V选项的sudo命令时会打印出默认需要检察的环境变量列表.
env_delete
将从用户的环境中删除的环境变量.这个参数可以是一个用双引号引起,由空格分隔的列表,或者是一个不带引号的单值.这个列表可以通过分别使用"=",+=","-=","!"来重写,增添,删除或取反.当以root身份执行带-V选项的sudo命令时会打印出默认将被删除的环境变量列表.
env_keep
当env_reset选项生效时将在用户的环境中保留的环境变量.这允许对sudo派生的进程的环境进行精密的控制.这个列表可以通过分别使用"=",+=","-=","!"来重写,增添,删除或取反.此列表默认没有成员.
当使用系统日志进行日志记录时,sudo将接受下列值作为系统日志设施(译注:原文为When logging via syslog(3), sudo accepts the following values for the syslog facility)(syslog参数的值):authpriv(如果您的操作系统支持的话),auth,daemon,user,local0, local1,local2,local3,local4,local5,local6和local7.下列系统日志优先级是被支持的:alert, crit,debug,emerg,err,info,notice和warning.
用户说明(user specification)
User_Spec ::= User_list Host_List = Cmnd_Spec_List \
(: User_Spec)*
Cmnd_Spec_List ::= Cmnd_Spec |
Cmnd_Spec , Cmnd_Spec_List
Cmnd_Spec ::= Runas_Spec? (NOPASSWD: | PASSWD:)? Cmnd
Runas_Spec ::= ( Runas_List )
用户说明决定在一个特定的主机上一个用户能够执行哪些命令.这些命令默认以root身份执行,但可以进行基于每个命令的更改.(译注:原文为By default, commands are run as root,but this can be changed on a per-command basis)
让我们把它分成下面这些部分:
Runas_Spec
Runas_Spec 是一个用括号括起的一个简单的Runas_List(在上面已经定义了),如果您在用户说明中没有指定一个Runas_Spec的话,将会使用默认的 root的Runas_Spec(译注:这里原文为:If you do not specify a Runas_Spec in the user specification, a default Runas_Spec of root will be used).Runas_Spec设置了他后面所跟命令的默认项(译注:原文为A Runas_Spec sets the default for commands that follow it,这句话我实在是不知道怎么翻译,暂且这么译吧).对于下面的条目:
dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/who
(译注:这里应该是dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm)
这意味着用户dgb可以运行/binls,/bin/kill和/usr/bin/lprm---但是只能以operator的身份执行.例如:
sudo -u operator /bin/ls
在一个条目的后面改写Runas_Spec也是可能的.如果我们把上面的条目改成这样:
dgb boulder = (operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm
这样用户dgb执行/bin/ls命令是以operator身份,但执行/bin/kill和/usr/bin/lprm命令就是以root身份.
NOPASSWD和PASSWD
默认地,sudo在用户执行一个命令前会验证用户的身份.通过NOPASSWD标签可以更改这个行为.就象Runas_Spec一样,NOPASSWD标签给跟在它后面的Cmnd_Spec_List中的命令设置了一个默认项(译注:原文是Like a Runas_Spec, the NOPASSWD tag sets a default for the commands that follow it in the Cmnd_Spec_List).PASSWD标签可以做相反的事.例如:
ray rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm
这将会允许用户ray在不进行身份验证的情况下在主机rushmore上以root身份运行/bin/kill,/bin/ls和/usr/bin/lprm命令.如果您想让ray在不提供口令的情况下只是可以运行/bin/kill,那么可以修改上面的条目为:
ray rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm
注意,尽管如此,PASSWD标签对于在exempt_group选项中指定了的组中的用户无效.
默认地,如果对当前主机上的某个用户的任何一个条目设置了NOPASSWD标签的话,他将能够运行sudo -l而不提供口令.另外,如果对属于当前主机的用户的所有条目都设置了NOPASSWD标签的话,这个用户就只能运行sudo -v而不提供口令.(译注:前面两句话的原文是By default, if the NOPASSWD tag is applied to any of the entries for a user on the current host, he or she will be able to run sudo -l without a password. Additionally, a user may only run sudo -v without a password if the NOPASSWD tag is present for all a users entries that pertain to the current host).这个行为可以通过设置verifypw和listpw选项来更改.
通配符(又称meta字符)
sudo允许在sudoers中的路径名和命令行参数中使用shell风格的通配符.通配符匹配是通过POSIX的fnmatch标准程序实现的.注意,这不是正则表达式.
* 匹配任意一组零个或者多个字符
? 匹配任意一个字符
[...] 匹配任意一个在大括号中指定范围里的字符
[!...] 匹配任何一个不在大括号中指定范围里的字符
\x 任意一个字符”x”识别为单纯的”x”.这用来转义像”*”,”?”,”[","]“和”}”这样的一些特殊字符
注意,路径名中的通配符不会匹配正斜线(“/”).在匹配命令行参数时,因为斜线不被通配符匹配,这使/usr/bin/*匹配/usr/bin/who而不匹配/usr/bin/X11/xterm.
通配符规则的例外
对上面的规则有下面的例外:
“”"” 如果空字符串”"是sudoers条目中仅有的命令行参数,这意味着这条命令执行时不允许带有任何参数.
其它的特殊字符和保留字
美元符(“#”)被用来指明一条注释(除非它出现在用户名上下文中并且后面跟有一个或多个数字,在这种情况下它被作为一个UID来对待).所有的注释字符和任何的文本,直到一行的结尾都将被忽略
保留字ALL是ailas中经常导致成功匹配的单位.它可以在任何可以使用Cmnd_Alias,User_Alias, Runas_Alias, 或Host_Alias的地方使用.您不应该试图定义一个名为ALL的别名,因为aleas中的单位将用作您的个人偏好.请注意,在命令上下文 (command context)中使用ALL是非常危险的,它允许用户在系统上运行任何命令.
感叹号(“!”)可以在别名中和Cmnd前用作逻辑非操作符.这允许排除一些特定的值.尽管如此,但请注意,联合ALL别名中的单位使用”!”将允许用户蓄意执行罕见的除了少数以外的所有命令(译注: 原文是Note ,however, that using a ! in conjunction with the built in ALL ailas to allow a user to run “all but few” commands rarely works as intended)(参阅下面的”安全要点”一节).
可以在一行的末尾使用反斜线(“\”)来在下一行延续此行,此时这两行将作为完整的一行对待.
列表元素和用户说明中的特殊语法字符之间的空格是可选的.
下面的字符作为一个词的一部分(例如,一个用户名或者一个主机名)出现时必需使用反斜线(“\”)来转义:”@”,”!”,”=”,”:”, “,”, “(“, “)”, “\”.
示例
下面是sudoers条目的示例.显然,一些示例有点不自然.首先,我们定义别名:
# User alias specification
User_Alias FULLTIMERS = millert, mikef, dowdy
User_Alias PARTTIMERS = bostley, jwfox, crawl
User_Alias WEBMASTERS = will, wendy, wim
# Runas alias specification
Runas_Alias OP = root, operator
Runas_Alias DB = oracle, sybase
# Host alias specification
Host_Alias SPARC = bigtime, eclipse, moet, anchor :\
SGI = grolsch, dandelion, black :\
ALPHA = widget, thalamus, foobar :\
HPPA = boa, nag, python
Host_Alias CUNETS = 128.138.0.0/255.255.0.0
Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0
Host_Alias SERVERS = master, mail, www, ns
Host_Alias CDROM = orion, perseus, hercules
# Cmnd alias specification
Cmnd_Alias DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\
/usr/sbin/restore, /usr/sbin/rrestore
Cmnd_Alias KILL = /usr/bin/kill
Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm
Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown
Cmnd_Alias HALT = /usr/sbin/halt, /usr/sbin/fasthalt
Cmnd_Alias REBOOT = /usr/sbin/reboot, /usr/sbin/fastboot
Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \
/usr/local/bin/tcsh, /usr/bin/rsh, \
/usr/local/bin/zsh
Cmnd_Alias SU = /usr/bin/su
接下来我们改写了一些编译进的默认值.我们希望sudo在所有情况下使用auth设施在系统日志中作记录.我们不想总是输出初次使用sudo的提示,并且用户millert使用sudo不需要口令.另外,我们为SERVERS Host_Alias中的主机维护一个附加的本地日志文件.并且由于这个日志需要保存许多年,我们要在日志的每一行中加入年份信息.
# Override built in defaults
Defaults syslog=auth
Defaults:FULLTIMERS !lecture
Defaults:millert !authenticate
Defaults@SERVERS log_year, logfile=/var/log/sudo.log
实际上决定谁能运行什么的是用户说明部分:
root ALL = (ALL) ALL
%wheel ALL = (ALL) ALL
我们让root和wheel组的成员可以在任何主机上以任何人的身份运行任何命令.
FULLTIMERS ALL = NOPASSWD: ALL
专职系统管理员(millert,mikef和dowdy)可以在任何主机上执行任何命令而不需要进行身份验证.
PARTTIMERS ALL = ALL
兼职系统管理员(bostley,jwfox和crawl)可以在任何主机上运行任何命令,但他们首先必须进行身份验证(因为这个条目没有NOPASSWD标签).
jack CSNETS = ALL
用户jack可以在CSNETS别名(网络128.138.243.0,128.138.204.0和128.138.242.0)中的机器上运行任何命令.在这些网络中,只有128.138.204.0明确的给出了掩码(用CIDR方式),指明这是个C类网.对CSNETS中的其他网络来说,如果本地主机的掩码匹配的话将使用本地主机的掩码.
lisa CUNETS = ALL
用户lisa可以在CUNETS别名(B类网络128.138.0.0)中的任何主机上执行任何命令.
operator ALL = DUMPS, KILL, PRINTING, SHUTDOWN, HALT, REBOOT,\
/usr/oper/bin/
用户operator可以执行的命令被限制在一个简单的maintenance中.这里就是和备份,杀死进程,打印系统,关闭系统和任何在/usr/oper/bin/中的命令.
joe ALL = /usr/bin/su operator
用户joe只能su成operator.
pete HPPA = /usr/bin/passwd [A-z]*, !/usr/bin/passwd root
用户pete可以修改HPPA上除了root以外任何用户的口令.注意,这里人为passwd不会在命令行上使用多个用户名.
bob SPARC = (OP) ALL : SGI = (OP) ALL
用户可以在SPARC和SGI上以任何在OP Runas_Alias中列出的用户(root和operator)的身份运行任何命令.
jim +biglab = ALL
用户jim可以在biglab网络用户组中的机器上运行任何命令.因为biglab前面加上了前缀”+”,所以sudo知道这是一个网络用户组.
+secretaries ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser
网络用户组secretaries中的用户需要帮助管理打印机和进行增删用户的工作,所以需要允许他们在任何机器上执行这些命令.
fred ALL = (DB) NOPASSWD: ALL
用户fred可以在DB Runas_Alias (oracle 或 sybase)上以任何人的身份执行任何命令而不需要提供口令.
john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*
用户john可以在ALPHA上su成除root的任何人,但是不允许他给su加上任何标志执行.
jen ALL, !SERVERS = ALL
用户jen可以在除了SERVERS Host_Alias (master, mail, www 和 ns)以外的任何机器上执行任何命令.
jill SERVERS = /usr/bin/, !SU, !SHELLS
用户jill可以在任何SERVERS Host_Alias中的机器上运行/usr/bin/下除了属于SU和SHELLS Cmnd_Aliases外的任何命令.
steve CSNETS = (operator) /usr/local/op_commands/
用户steve可以在任何CSNETS中的机器上执行/usr/local/op_commands/中的所有命令,但是只能以operator的身份.
matt valkyrie = KILL
用户matt应该可以在他自己的工作站valkyrie上杀死挂起的进程.
WEBMASTERS www = (www) ALL, (root) /usr/bin/su www
任何在WEBMASTERS User_Alias (will, wendy,和 wim)中的用户都能够在主机www上以www(网页的所有者)的身份执行任何命令,或者简单的su成www.
ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\
/sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM
所有的用户都应该能够在 CDROM Host_Alias (orion, perseus, hercules)中的主机上mount和unmount光盘驱动器而不需要输入口令.对用户来说敲入这么长的命令有些冗长而乏味,所以把它封装在一个 shell脚本中是一个最佳的选择.
安全要点
使用”!”来从ALL中减去命令一般来说不会产生预期作用.用户可以简单的通过把希望执行的命令改名执行的法子来绕过限制.例如:
bill ALL = ALL, !SU, !SHELLS
这并不会阻止bill执行SU和SHELLS中列出的命令.他只需要把这些命令改一个名字,或者从一个编辑器或者其他程序中escape到shell(译注:原文是use a shell escape from an editor or other program)就可以运行了.所以这种类型的限制至少应该经过深思熟虑(并从策略上加强它).
CAVEATS
sudoers必需总是使用visudo命令来编辑,因为它会锁定文件并且进行语法检察.这强制sudoers摆脱语法错误,因为sudoers有语法错误时sudo是不会运行的.
当使用机器的网络用户组时(与用户相反),如果您在网络用户组中存贮了完整的主机名(这经常是事实),您需要让主机名像hostname命令的输出一样是完整的或者在sudoers中使用fqdn选项.
文件
/etc/sudoers 谁能作什么的一个列表
/etc/group 本地组文件
/etc/netgroup 网络组文件
描述
sudoers配置文件由两种内容组成:别名(基本变量)和用户说明(user specification)(定义了谁能运行什么).sudoers的语法将在下面用扩展的巴科斯-诺尔范式(Extended Backus-Naur Form,EBNF)描述.如果您不知道什么是EBNF是什么的话也请不要放弃,事实上它很简单,并且下面用它作的定义都是经过注释的.
EBNF的快速指导
EBNF是用来描述某种语言的语法的一种简洁且精确的方法.每一个EBNF定义都是由”production rules”这种形式组成的.例如:
symbol ::= definition | alternate1 |alternate2 ………..
每一个”production rule”都和其它的”production rule”有关联,这样就构成了这种语言的语法.EBNF也包含了下面的操作符,许多读者都能够认出这是正则表达式(regular expression)的符号.但是,不要把它们和通配符(wildcard0搞混淆了.它们有着不同的含义.
? 意味着前面的一个记号(symbol)或者一组记号(group of symbol)是可选的,也就是说,可以出现一次或根本就不出现
* 在前面的一个或者一组记号出现零次或多次
+ 在前面的一个或者一组记号出现一次或多次
括号可以用来把记号组合在一起(to group symbols together),单引号可以把一个字符串按照他的字面意思来解释(这与记号的名字相反).
别名
有四种别名:User_Alias,Runas_Alias,Host_Alias和Cmnd_Alias.
Alias ::= User_Alias User_Alias (: User_Alias)* |
Runas_Alias Runas_Alias (: Runas_Alias)* |
Host_Alias Host_Alias (: Host_Alias)* |
Cmnd_Alias Cmnd_Alias (: Cmnd_Alias)*
User_Alias ::= >Runas_Alias ::= >Host_Alias ::= >Cmnd_Alias ::= >NAME ::= [A-Z]([A-Z][0-9]_)*
每一个别名都是按这种形式定义的:
Alias_Type item2, ………………..
这里Alias_Type是User_Alias,Runas_Alias,Host_Alias,Cmnd_Alias中的一个,NAMEW是一个由大写字母,数字和下划线组成的字符串,并且它必需以一个大写字母开头.可以把同一类型的多个别名定义放在同一行里,中间以一个冒号隔开.例如:
Alias_Type item2, item3 : item5
一个组成合法别名成员的定义紧随其后.(The definitions of what constitutes a valid alias member follow.)
User_List ::= User |
User , User_List
User ::= !* username |
!* %group |
!* +netgroup |
!* User_Alias
(译注:这里应该是
User_List ::= User |
User , User_List
User ::= !* username |
!* #uids |
!* %group |
!* +netgroup |
!* User_Alias
才对)
一个User_List是由一个或多个用户名,用户ID(要加上”#”前缀),系统用户组(要加上”%”前缀),网络组(要加上”+”前缀)或者其它 User_Alias组成.每一个列表项都可以加上一个或多个”!”前缀.奇数个”!”使这个列表项取反,偶数个”!”没有任何作用.(译注:这里的”! “也就是取反啦)
Runas_List ::= Runas_User |
Runas_User , Runas_List
Runas_User ::= !* username |
!* #uid |
!* %group |
!* +netgroup |
!* Runas_Alias
Runas_List和User_List是很相象的,仅仅是用Runas_Aliases替代了User_Aliases
Host_List ::= Host |
Host , Host_List
Host ::= !* hostname |
!* ip_addr |
!* network(/netmask)? |
!* +netgroup |
!* Host_Alias
Host_List 是由一个或者多个主机名,IP地址,网络号,网络组(要加上”+”前缀)或者其他的Host_Alias组成的.同样的,一个列表项的值也可以用”!”来取消.如果您使用了一个网络号但是没有随之指定子网掩码,那么主机的以太网接口的子网掩码将被使用—–如果它能够相配的话.子网掩码可以用点分十进制表示法来指定(如:255.255.255.0),也可以用CIDR(无类型域间选路)表示法指定(采用掩码中1的为数,如:24.这和前面的 255.255.255.0是等价的).主机名可以包含shell风格的通配符(请查看下面的”通配符”一节),但是除非您机器上的hostname命令能返回完整的主机名,为了使通配符有效您需要使用fqdn选项(见下面的”标志”小节)
Cmnd_List ::= Cmnd |
Cmnd , Cmnd_List
commandname ::= filename |
filename args |
filename “”
Cmnd ::= !* commandname |
!* directory |
!* Cmnd_Alias
Cmnd_List 是由一个或多个命令名,目录或者其他Cmnd_Alias组成的列表.命令名是一个可以包含shell风格通配符(请查看下面的”通配符”一节)的完整文件名.一个简单的文件名永许用户以任何他们想使用的参数来执行命令.但是您也可以指定命令行参数(可以包含通配符).您还可以通过交替的使用” “来说明这个命令执行时不能带任何命令行参数.当您在Cmnd_List中指定了一个目录时,用户将可以执行这个目录中的任何文件(不包括子目录中的文件).
如果Cmnd关联上了命令行参数,那么用户在命令行上所给的参数必需精确的匹配Cmnd中的参数(或者要和通配符匹配).注意,如果下面的字符在命令参数中出现的话,必须使用”\”来将其转义: ,, :, =, .
默认项
通过一个或多个Default_Entry行,一些特定的配置选项在运行时可以从它们的默认值改变.(译注:好拗口哦:p)这些选项可以对在任何主机上的所有用户或者在某个特定主机上的所有用户或者仅仅是一个特定的用户产生作用.如果多个条目都匹配,那么它们会按顺序执行.如果有冲突的值,那么最后一个匹配行上的值将会产生作用.
Default_Type ::= Defaults ||
Defaults : User ||
Defaults @ Host
Default_Entry ::= Default_Type Parameter_List
Parameter ::= Parameter = Value ||
Parameter += Value ||
Parameter -= Value ||
!* Parameter ||
Parameters 可以是标志(flags),整数值(integer values),字符串(strings)或者列表(lists).标志是一个布尔值,可以通过使用”!”操作符来取反.一些整数,字符串和列表参数也可以在布尔上下文中使用以使其取反.由多个单词组成的值必须用双引号引起来.一些特殊字符必须用”\”转义.
列表还有两个附加的操作符,+=和-=.这两个操作符被分别用来从一个列表中增加或删除条目.用”-=”操作符从列表中删除不存在的项目并不算是错误.
注意,由于sudoers文件是按顺序解析的,所以放置Default段的最佳位置是在Host,User和Cmnd别名段之后,用户定义段之前.
标志
long_otp_prompt
When validating with a One Time Password scheme (S/Key or OPIE), a two-line prompt is used to make it easier to cut and paste the challenge to a local window. Its not as pretty as the default but some people find it more convenient. This flag is off by default.
(译注:这一段我还没读懂,贴原文上来吧)
ignore_dot
如果设置(为on)的话,sudo将会忽略PATH环境变量中的.或者(就是当前目录).PATH本身不会被修改.这个标志默认是on.
mail_always
每当有用户使用sudo时就给mailto user发送一封邮件.此标志默认是off.
mail_badpass
当用户使用sudo但是却输入了错误的口令时将给mailto user发送一封邮件.此标志默认是off.
mail_no_user
如果使用sudo的用户在sudoers中没有记录的话将给mailto user发送一封邮件.此标志默认为on.
mail_no_host
如果使用sudo的用户在sudoers中有记录,但是他不被永许在正在使用的主机上使用sudo,将给mailto user(请查看”可以用在布尔上下文中的字符串”一节)发送一封邮件.此标志默认为off.
mail_no_perms
如果用户有使用sudo的权限,但是他试图用sudo使用的命令在sudoers中没有列出来,那么给mailto user发送一封邮件.此标志默认为off.
tty_tickets
如果设置(为on)的话,用户必须使用基于终端(tty)的的验证方法.一般的,sudo在ticket dir里使用一个与执行sudo的用户同名的目录.这个标志设置后,sudo将在那个目录中使用一个与执行sudo的用户登录tty同名的文件.此标志默认为on.
lecture
如果设置(为on)的话,初次使用sudo的用户将收到一个简短的lecture.此标志默认为on.
authenticate
如果设置(为on)的话,用户在用sudo执行命令之前必须通过口令(或者通过其他的方式)来验证身分.这个默认选项可以通过设置PASSWD和NOPASSWD标签(tags)来覆盖.此标志默认为on.
root_sudo
如果设置(为on)的话,root也将被永许使用sudo.将此标志设置为off来阻值用户通过使用类似于”sudo sudo /bin/sh”这样的连锁sudo命令来获得一个root权限的shell.此标志默认为on.
log_host
如果设置(为on)的话,主机名将被记录在sudo的日志文件(不是系统日志)中.此标志默认为off.
log_year
如果设置(为on)的话,四位的年份将被记录在sudo的日志文件(不是系统日志)中).此标志默认为off.
shell_noargs
如果设置(为on)并且sudo并未带任何参数执行的话,sudo的表现就象是带-s选项一样.也就是说,将会以root身分运行一个shell(如果 SHELL环境变量被设置的话,这个shell就是SHELL定义的shell,否则,将运行用户/etc/passwd中项的shell字段定义的 shell).此标志默认为off.
set_home
如果设置(为on)并且sudo是带-s选项执行的话,HOME环境变量将被设置为目标用户(target user)(除非sudo使用了-u选项,目标用户就是root)的主目录.这实际上使-s选项包含了-H选项.此标志默认为off.
always_set_home
如果设置(为on)的话,sudo将把HOME环境变量设置为目标用户(target user)(除非sudo使用了-u选项,目标用户就是root)的主目录.这实际上意味着-H选项总是被包含.此标志默认是off.
path_info
一般来说,如果一个命令不能在PATH环境变量中找到的话,sudo将会告诉用户.但是某些站点可能会希望禁止这个特性.因为这可以用来收集一些关于普通用户没有权限执行的命令的位置的信息.不利之处在于,如果命令只是不在用户的PATH中的话,sudo将告诉用户他们不被永许执行这些命令,这可能会把人高糊涂.此标志默认是off.
preserve_groups
默认地,sudo会初始化目标用户(target user)所在组列表的组向量(译注:原文是By default sudo will initialize the group vector to the list of groups the target user is in.)preserve_groups设置后,用户已存在的组向量将被保存不变.真实组ID和有效组ID仍然会被设置与目标用户相匹配.此标志默认是 off,
fqdn
如果您想在sudoers中使用完整主机名的话,请设置此项.例如:使用myhost.mydomain.edu来替代 myhost.设置后如果原意的话您也可以使用短格式(甚至把两种格式混合起来使用).注意,打开fqdn标志需要让sudo进行DNS解析,而如果 DNS停止工作(例如机器没有连入网络)的话会导致sudo无法使用.同时需要注意的是,您必须使用DNS知道的主机正式名称,也就是说您不能使用主机的别名(CNAME entry),因为您无法从DNS处得到所有的别名.如果您机器的主机名(就是hostname命令的输出)已经是完整格式,您就不需要设置fqdn.此标志默认是off.
insults
如果设置(为on)的话,sudo将会侮辱(insult)输入错误口令的用户(译注:这也可以?:p).此标志默认为off.
requiretty
如果设置(为on)的话,sudo仅仅在用户从一个真正的tty上登录时才会执行.这将不永许像”rsh somehost sudo ls”这样的命令,因为rsh并不分配一个tty.因为当没有tty存在时无法关闭echo,所以一些站点可能会希望设置这个标志来阻止用户输入可见(回显)的口令.此标志默认为off.
env_editor
如果设置(为on)的话,visudo将使用在EDITOR或者VISUAL环境变量中定义的编辑器,如果EDITOR和VISUAL都没有定义的话将使用默认的编辑器列表.注意,这可能造成一个安全漏洞,因为这永许用户以root身份运行任意的命令而不被日志记录.一个安全的变通方法是在editor(见下面的”字符串”小节)中保存一个用冒号分隔的编辑器列表.这样visudo将仅仅使用EDITOR或者VISUAL中定义的编辑器—–如果它们和editor列表中的某个项目匹配的话.
rootpw
如果设置(为on)的话,sudo将提示输入root的口令而不是执行sudo命令的用户的口令.此标志默认为off.
runaspw
如果设置(为on)的话,sudo将提示输入由runsa_default选项定义的用户(默认为root)的口令而不是执行sudo命令的用户的口令.此标志默认为off.
targetpw
如果设置(为on)的话,sudo将提示输入由sudo的-u选项指定的用户(默认为root)的口令而不是执行sudo的用户的口令.此标志默认为off.
set_logname
一般地,sudo将把LOGNAME和USER环境变量设置为目标用户(除非使用了-u选项的话,就是root)的名字.但是,因为一些程序(包括RCS版本控制系统)使用LOGNAME来确认用户的真实身份,它可能想要改变这种行为,这可以通过取消set_logname选项来实现.
stay_setuid
一般地,当sudo执行一个命令时,真实UID和有效UID都被设置为目标用户(默认是root)的UID.这个选项改变了这种行为,它把真实UID保留为执行sudo的用户的UID.换句话说,这使sudo成为了一个setuid程序.这在那些当setuid程序运行时禁用一些有潜在危险的功能的系统上会很有用.尽管如此,请注意这意味着sudo运行时的真实UID将是执行sudo命令的用户的UID,这可能会允许用户在能够在日志中记录下一个 failure之前杀死sudo,这倚赖于您的操作系统如何定义信号和setuid进程之间的相互作用.
env_reset
如果设置(为 on)的话,sudo将把环境重置为只包含下列变量:HOME,LOGNAME,PATH,SHELL,TERM和USER(此外还有SUDO_*).在这些变量中,只有TERM保留原环境中的值不变,其他的变量都被设置为默认值(值可能被set_logname选项修改).如果sudo编译时加入了 SECURE_PATH选项,它的值将被作为PATH环境变量的值.其他的变量可以由设置env_keep选项来保存.
use_loginclass
设置(为on)的话,sudo将执行对目标用户的登录类指定的默认动作—-如果存在的话.此选项仅仅在sudo配置时带有–with-logincap选项时才存在.此标志默认是off.
整数
passwd_tries
sudo向日志中写入一个failure并退出之前允许用户输入口令的次数,默认为3.
可以用在布尔上下文中的整数(integers that can be used in a boolean context)
loglinelen
日志文件每行中的字母数.这个值用来决定日志文件中什么时候折行.这个选项仅影响sudo的日志,而对系统日志文件没有影响.默认值为80(使用0或者取消此选项来禁止折行).
timestamp_timeout
sudo再次询问口令之前逝去的时间(以分钟记).默认值为5.如果想要总是询问口令的话请把此值设置为0.如果设置为负数的话,用户的时间戳永远不会过期.这可以用来允许用户分别使用sudo -v和sudo -k来建立或者删除他们自己的时间戳.
passwd_timeout
sudo的口令询问超时时间(分钟记).默认为5.设置为0可以取消口令超时.
umask
执行命令时使用的umask值.要保留用户的umask值的话请取消此选项或者设置为0777.此选项的默认值为0022.
字符串
mailsub
发送给mailto user的邮件使用的主题.转义字符%h将被扩展为机器的主机名.默认值为”*** SECURITY information for %h ***”.
badpass_message
当用户输入了错误的口令时显示的信息.除非设置了insults的话,默认值将为”Sorry, try again.”
timestampdir
sudo存储时间戳文件的目录.默认值为/var/run/sudo
passprompt
询问口令时的提示.可以被sudo的-p选项或者SUDO_PROMPT环境变量所覆盖.这里提供了两个转义字符:%u将被扩展为用户的登录名,而%h将被扩展为本地主机名.此选项的默认值为”Password:”.
runas_default
使用sudo但没有指定-u标志时使用的默认用户.默认为root
syslog_goodpri
用户身份验证成功时使用的系统日志优先级.默认为notice
syslog_badpri
用户身份验证成功时使用的系统日志优先级.默认为alert
editor
用冒号分隔开的一个允许visudo使用的编辑器列表.可能的话visudo将选择使用和用户的USER环境变量相匹配的那个编辑器,或者是列表中的第一个存在且可执行的编辑器.默认值为您系统中vi编辑器的路径.
可以用在布尔上下文中的字符串(strings that can used in a boolean context)
logfile
sudo日志(不是系统日志)的存放位置.设置一个路径来打开日志功能,取消设置将关闭日志功能.(Seting a path turns on logging to a file; negating this option turns it off.)
syslog
如果起用了syslog的话将使用的系统日志设施(取消此选项来禁用系统日志记录)(译注:原文为:Syslog facility if syslog is being used for logging (negate to disable syslog logging)).默认为arthpriv.
mailerpath
用来发送报警邮件的邮件程序的路径.默认值是sendmail的路径.
mailerflags
使用邮件程序时的标记,默认为 -t.
mailto
发送报警邮件和错误邮件的目的地址.这个地址必须用双引号引起来,以免sudo解释”@”符号.默认值为root.
exempt_group
在此组中的用户将不要求口令和PATH.此选项默认没有设置.
verifypw
此选项控制当用户使用带有-v选项的sudo时,何时要求口令.它可以有下面可能的值:
all:当前主机上sudoers中所有的用户条目都必须设置NOPASSWD标志来避免输入口令.
any:当前主机上sudoers中至少有一个用户条目必须设置NOPASSWD标志来避免输入口令.
never:用户使用-v标志但从不需要输入口令.
always:用户使用-v标志但总是需要输入口令.
默认的值是”all”.
listpw
此选项控制当用户使用带有-l选项的sudo时,何时要求口令.它可以有下面可能的值:
all:[/size当前主机上sudoers中所有的用户条目都必须设置NOPASSWD标志来避免输入口令.
any:当前主机上sudoers中至少有一个用户条目必须设置NOPASSWD标志来避免输入口令.
never:用户使用-l标志但从不需要输入口令.
always:用户使用-l标志但总是需要输入口令.
默认值为"any".
可以在布尔上下文中使用的列表(lists that can be used in a boolean context)
env_check
如果含有"%"或者"/"字符的话将从用户的环境中删除的环境变量.这将预防拙劣的程序中printf风格的格式所带来的伤害.这个参数可以是一个用双引号引起,由空格分隔的列表,或者是一个不带引号的单值.这个列表可以通过分别使用"=",+=","-=","!"来重写,增添,删除或取反.当以root 身份执行带-V选项的sudo命令时会打印出默认需要检察的环境变量列表.
env_delete
将从用户的环境中删除的环境变量.这个参数可以是一个用双引号引起,由空格分隔的列表,或者是一个不带引号的单值.这个列表可以通过分别使用"=",+=","-=","!"来重写,增添,删除或取反.当以root身份执行带-V选项的sudo命令时会打印出默认将被删除的环境变量列表.
env_keep
当env_reset选项生效时将在用户的环境中保留的环境变量.这允许对sudo派生的进程的环境进行精密的控制.这个列表可以通过分别使用"=",+=","-=","!"来重写,增添,删除或取反.此列表默认没有成员.
当使用系统日志进行日志记录时,sudo将接受下列值作为系统日志设施(译注:原文为When logging via syslog(3), sudo accepts the following values for the syslog facility)(syslog参数的值):authpriv(如果您的操作系统支持的话),auth,daemon,user,local0, local1,local2,local3,local4,local5,local6和local7.下列系统日志优先级是被支持的:alert, crit,debug,emerg,err,info,notice和warning.
用户说明(user specification)
User_Spec ::= User_list Host_List = Cmnd_Spec_List \
(: User_Spec)*
Cmnd_Spec_List ::= Cmnd_Spec |
Cmnd_Spec , Cmnd_Spec_List
Cmnd_Spec ::= Runas_Spec? (NOPASSWD: | PASSWD:)? Cmnd
Runas_Spec ::= ( Runas_List )
用户说明决定在一个特定的主机上一个用户能够执行哪些命令.这些命令默认以root身份执行,但可以进行基于每个命令的更改.(译注:原文为By default, commands are run as root,but this can be changed on a per-command basis)
让我们把它分成下面这些部分:
Runas_Spec
Runas_Spec 是一个用括号括起的一个简单的Runas_List(在上面已经定义了),如果您在用户说明中没有指定一个Runas_Spec的话,将会使用默认的 root的Runas_Spec(译注:这里原文为:If you do not specify a Runas_Spec in the user specification, a default Runas_Spec of root will be used).Runas_Spec设置了他后面所跟命令的默认项(译注:原文为A Runas_Spec sets the default for commands that follow it,这句话我实在是不知道怎么翻译,暂且这么译吧).对于下面的条目:
dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/who
(译注:这里应该是dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm)
这意味着用户dgb可以运行/binls,/bin/kill和/usr/bin/lprm---但是只能以operator的身份执行.例如:
sudo -u operator /bin/ls
在一个条目的后面改写Runas_Spec也是可能的.如果我们把上面的条目改成这样:
dgb boulder = (operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm
这样用户dgb执行/bin/ls命令是以operator身份,但执行/bin/kill和/usr/bin/lprm命令就是以root身份.
NOPASSWD和PASSWD
默认地,sudo在用户执行一个命令前会验证用户的身份.通过NOPASSWD标签可以更改这个行为.就象Runas_Spec一样,NOPASSWD标签给跟在它后面的Cmnd_Spec_List中的命令设置了一个默认项(译注:原文是Like a Runas_Spec, the NOPASSWD tag sets a default for the commands that follow it in the Cmnd_Spec_List).PASSWD标签可以做相反的事.例如:
ray rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm
这将会允许用户ray在不进行身份验证的情况下在主机rushmore上以root身份运行/bin/kill,/bin/ls和/usr/bin/lprm命令.如果您想让ray在不提供口令的情况下只是可以运行/bin/kill,那么可以修改上面的条目为:
ray rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm
注意,尽管如此,PASSWD标签对于在exempt_group选项中指定了的组中的用户无效.
默认地,如果对当前主机上的某个用户的任何一个条目设置了NOPASSWD标签的话,他将能够运行sudo -l而不提供口令.另外,如果对属于当前主机的用户的所有条目都设置了NOPASSWD标签的话,这个用户就只能运行sudo -v而不提供口令.(译注:前面两句话的原文是By default, if the NOPASSWD tag is applied to any of the entries for a user on the current host, he or she will be able to run sudo -l without a password. Additionally, a user may only run sudo -v without a password if the NOPASSWD tag is present for all a users entries that pertain to the current host).这个行为可以通过设置verifypw和listpw选项来更改.
通配符(又称meta字符)
sudo允许在sudoers中的路径名和命令行参数中使用shell风格的通配符.通配符匹配是通过POSIX的fnmatch标准程序实现的.注意,这不是正则表达式.
* 匹配任意一组零个或者多个字符
? 匹配任意一个字符
[...] 匹配任意一个在大括号中指定范围里的字符
[!...] 匹配任何一个不在大括号中指定范围里的字符
\x 任意一个字符”x”识别为单纯的”x”.这用来转义像”*”,”?”,”[","]“和”}”这样的一些特殊字符
注意,路径名中的通配符不会匹配正斜线(“/”).在匹配命令行参数时,因为斜线不被通配符匹配,这使/usr/bin/*匹配/usr/bin/who而不匹配/usr/bin/X11/xterm.
通配符规则的例外
对上面的规则有下面的例外:
“”"” 如果空字符串”"是sudoers条目中仅有的命令行参数,这意味着这条命令执行时不允许带有任何参数.
其它的特殊字符和保留字
美元符(“#”)被用来指明一条注释(除非它出现在用户名上下文中并且后面跟有一个或多个数字,在这种情况下它被作为一个UID来对待).所有的注释字符和任何的文本,直到一行的结尾都将被忽略
保留字ALL是ailas中经常导致成功匹配的单位.它可以在任何可以使用Cmnd_Alias,User_Alias, Runas_Alias, 或Host_Alias的地方使用.您不应该试图定义一个名为ALL的别名,因为aleas中的单位将用作您的个人偏好.请注意,在命令上下文 (command context)中使用ALL是非常危险的,它允许用户在系统上运行任何命令.
感叹号(“!”)可以在别名中和Cmnd前用作逻辑非操作符.这允许排除一些特定的值.尽管如此,但请注意,联合ALL别名中的单位使用”!”将允许用户蓄意执行罕见的除了少数以外的所有命令(译注: 原文是Note ,however, that using a ! in conjunction with the built in ALL ailas to allow a user to run “all but few” commands rarely works as intended)(参阅下面的”安全要点”一节).
可以在一行的末尾使用反斜线(“\”)来在下一行延续此行,此时这两行将作为完整的一行对待.
列表元素和用户说明中的特殊语法字符之间的空格是可选的.
下面的字符作为一个词的一部分(例如,一个用户名或者一个主机名)出现时必需使用反斜线(“\”)来转义:”@”,”!”,”=”,”:”, “,”, “(“, “)”, “\”.
示例
下面是sudoers条目的示例.显然,一些示例有点不自然.首先,我们定义别名:
# User alias specification
User_Alias FULLTIMERS = millert, mikef, dowdy
User_Alias PARTTIMERS = bostley, jwfox, crawl
User_Alias WEBMASTERS = will, wendy, wim
# Runas alias specification
Runas_Alias OP = root, operator
Runas_Alias DB = oracle, sybase
# Host alias specification
Host_Alias SPARC = bigtime, eclipse, moet, anchor :\
SGI = grolsch, dandelion, black :\
ALPHA = widget, thalamus, foobar :\
HPPA = boa, nag, python
Host_Alias CUNETS = 128.138.0.0/255.255.0.0
Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0
Host_Alias SERVERS = master, mail, www, ns
Host_Alias CDROM = orion, perseus, hercules
# Cmnd alias specification
Cmnd_Alias DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\
/usr/sbin/restore, /usr/sbin/rrestore
Cmnd_Alias KILL = /usr/bin/kill
Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm
Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown
Cmnd_Alias HALT = /usr/sbin/halt, /usr/sbin/fasthalt
Cmnd_Alias REBOOT = /usr/sbin/reboot, /usr/sbin/fastboot
Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \
/usr/local/bin/tcsh, /usr/bin/rsh, \
/usr/local/bin/zsh
Cmnd_Alias SU = /usr/bin/su
接下来我们改写了一些编译进的默认值.我们希望sudo在所有情况下使用auth设施在系统日志中作记录.我们不想总是输出初次使用sudo的提示,并且用户millert使用sudo不需要口令.另外,我们为SERVERS Host_Alias中的主机维护一个附加的本地日志文件.并且由于这个日志需要保存许多年,我们要在日志的每一行中加入年份信息.
# Override built in defaults
Defaults syslog=auth
Defaults:FULLTIMERS !lecture
Defaults:millert !authenticate
Defaults@SERVERS log_year, logfile=/var/log/sudo.log
实际上决定谁能运行什么的是用户说明部分:
root ALL = (ALL) ALL
%wheel ALL = (ALL) ALL
我们让root和wheel组的成员可以在任何主机上以任何人的身份运行任何命令.
FULLTIMERS ALL = NOPASSWD: ALL
专职系统管理员(millert,mikef和dowdy)可以在任何主机上执行任何命令而不需要进行身份验证.
PARTTIMERS ALL = ALL
兼职系统管理员(bostley,jwfox和crawl)可以在任何主机上运行任何命令,但他们首先必须进行身份验证(因为这个条目没有NOPASSWD标签).
jack CSNETS = ALL
用户jack可以在CSNETS别名(网络128.138.243.0,128.138.204.0和128.138.242.0)中的机器上运行任何命令.在这些网络中,只有128.138.204.0明确的给出了掩码(用CIDR方式),指明这是个C类网.对CSNETS中的其他网络来说,如果本地主机的掩码匹配的话将使用本地主机的掩码.
lisa CUNETS = ALL
用户lisa可以在CUNETS别名(B类网络128.138.0.0)中的任何主机上执行任何命令.
operator ALL = DUMPS, KILL, PRINTING, SHUTDOWN, HALT, REBOOT,\
/usr/oper/bin/
用户operator可以执行的命令被限制在一个简单的maintenance中.这里就是和备份,杀死进程,打印系统,关闭系统和任何在/usr/oper/bin/中的命令.
joe ALL = /usr/bin/su operator
用户joe只能su成operator.
pete HPPA = /usr/bin/passwd [A-z]*, !/usr/bin/passwd root
用户pete可以修改HPPA上除了root以外任何用户的口令.注意,这里人为passwd不会在命令行上使用多个用户名.
bob SPARC = (OP) ALL : SGI = (OP) ALL
用户可以在SPARC和SGI上以任何在OP Runas_Alias中列出的用户(root和operator)的身份运行任何命令.
jim +biglab = ALL
用户jim可以在biglab网络用户组中的机器上运行任何命令.因为biglab前面加上了前缀”+”,所以sudo知道这是一个网络用户组.
+secretaries ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser
网络用户组secretaries中的用户需要帮助管理打印机和进行增删用户的工作,所以需要允许他们在任何机器上执行这些命令.
fred ALL = (DB) NOPASSWD: ALL
用户fred可以在DB Runas_Alias (oracle 或 sybase)上以任何人的身份执行任何命令而不需要提供口令.
john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*
用户john可以在ALPHA上su成除root的任何人,但是不允许他给su加上任何标志执行.
jen ALL, !SERVERS = ALL
用户jen可以在除了SERVERS Host_Alias (master, mail, www 和 ns)以外的任何机器上执行任何命令.
jill SERVERS = /usr/bin/, !SU, !SHELLS
用户jill可以在任何SERVERS Host_Alias中的机器上运行/usr/bin/下除了属于SU和SHELLS Cmnd_Aliases外的任何命令.
steve CSNETS = (operator) /usr/local/op_commands/
用户steve可以在任何CSNETS中的机器上执行/usr/local/op_commands/中的所有命令,但是只能以operator的身份.
matt valkyrie = KILL
用户matt应该可以在他自己的工作站valkyrie上杀死挂起的进程.
WEBMASTERS www = (www) ALL, (root) /usr/bin/su www
任何在WEBMASTERS User_Alias (will, wendy,和 wim)中的用户都能够在主机www上以www(网页的所有者)的身份执行任何命令,或者简单的su成www.
ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\
/sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM
所有的用户都应该能够在 CDROM Host_Alias (orion, perseus, hercules)中的主机上mount和unmount光盘驱动器而不需要输入口令.对用户来说敲入这么长的命令有些冗长而乏味,所以把它封装在一个 shell脚本中是一个最佳的选择.
安全要点
使用”!”来从ALL中减去命令一般来说不会产生预期作用.用户可以简单的通过把希望执行的命令改名执行的法子来绕过限制.例如:
bill ALL = ALL, !SU, !SHELLS
这并不会阻止bill执行SU和SHELLS中列出的命令.他只需要把这些命令改一个名字,或者从一个编辑器或者其他程序中escape到shell(译注:原文是use a shell escape from an editor or other program)就可以运行了.所以这种类型的限制至少应该经过深思熟虑(并从策略上加强它).
CAVEATS
sudoers必需总是使用visudo命令来编辑,因为它会锁定文件并且进行语法检察.这强制sudoers摆脱语法错误,因为sudoers有语法错误时sudo是不会运行的.
当使用机器的网络用户组时(与用户相反),如果您在网络用户组中存贮了完整的主机名(这经常是事实),您需要让主机名像hostname命令的输出一样是完整的或者在sudoers中使用fqdn选项.
文件
/etc/sudoers 谁能作什么的一个列表
/etc/group 本地组文件
/etc/netgroup 网络组文件
看一个国家的国民教育,要看他的公共厕所。
看一个男人的品味,要看他的袜子。
看一个女人是否养尊处优,要看她的手。
看一个人的气血,要看他的头发。
看一个人的心术,要看他的眼神。
看一个人的身价,要看他的对手。
看一个人的底牌.要看他身边的好友。
看一个人的性格,要看他的字写得怎样。
看一个人是否快乐,不要看笑容,要看清晨梦醒时的一刹那表情。
看一个人的胸襟,要看他如何面对失败及被人出卖。
看两个人的关系,要看发生意外时,另一方的紧张程度。
看一个男人的品味,要看他的袜子。
看一个女人是否养尊处优,要看她的手。
看一个人的气血,要看他的头发。
看一个人的心术,要看他的眼神。
看一个人的身价,要看他的对手。
看一个人的底牌.要看他身边的好友。
看一个人的性格,要看他的字写得怎样。
看一个人是否快乐,不要看笑容,要看清晨梦醒时的一刹那表情。
看一个人的胸襟,要看他如何面对失败及被人出卖。
看两个人的关系,要看发生意外时,另一方的紧张程度。
为何慢:
可以用ssh的详细模式跟踪(ssh -v x.x.x.x)一下,是不是DNS反解析?
这个问题正是最后面那项 GSSAPIAuthentication 引起的,打开这个ssh的时候可能会先去尝试其他的认证方式.很多地方都会介绍说修改 /etc/ssh/ssh_config 文件,但是其实这并不是最好的办法,因为在下次升级的时候,也许会因为配置文件被修改过,而引起不必要的麻烦.我的解决办法是修改个人用户的配置文件,如下:
echo “GSSAPIAuthentication no” >> ~/.ssh/config
1)修改:/etc/ssh/ssh_config 文件:GSSAPIAuthentication no ,UseDNS no。 vi /etc/ssh/sshd_config ,别少了个D。
2)也可以修改:~/.ssh/config :GSSAPIAuthentication no ,echo “GSSAPIAuthentication no” >> ~/.ssh/config
阅读全文
可以用ssh的详细模式跟踪(ssh -v x.x.x.x)一下,是不是DNS反解析?
这个问题正是最后面那项 GSSAPIAuthentication 引起的,打开这个ssh的时候可能会先去尝试其他的认证方式.很多地方都会介绍说修改 /etc/ssh/ssh_config 文件,但是其实这并不是最好的办法,因为在下次升级的时候,也许会因为配置文件被修改过,而引起不必要的麻烦.我的解决办法是修改个人用户的配置文件,如下:
echo “GSSAPIAuthentication no” >> ~/.ssh/config
1)修改:/etc/ssh/ssh_config 文件:GSSAPIAuthentication no ,UseDNS no。 vi /etc/ssh/sshd_config ,别少了个D。
2)也可以修改:~/.ssh/config :GSSAPIAuthentication no ,echo “GSSAPIAuthentication no” >> ~/.ssh/config
阅读全文
#!/bin/bash
#filename:getar
#desp:get a tar file from a dir!
out=`pwd`/admin_output
pike=/usr/bin/pike
if [ -n "$1" -a "$1" != "${1//[^0-9]/}” ];then
echo “The first parameter is not a number!”
exit
elif [[ $1 == "" ]];then
echo “The first parameter is null!”
exit
fiif [ -n "$2" -a "$2" != "${2//[^0-9]/}” ];then
echo “The second parameter is not a number!”
exit
elif [[ $2 == "" ]];then
echo “The second parameter is null!”
exit
else
touch /tmp/pike.tmp
sleep 10
$pike process_kaiqi_cid.pike $1 $2
while true;do
if [[ -e output/cid$2/standard/operamini-hifi_kaiqi-zh.jad && -e output/cid$2/standard/operamini-hifi_kaiqi-zh.jar ]];then
find `pwd`/output -type f -newer /tmp/pike.tmp | xargs tar czf $out/$1-$2.tgz >/dev/null 2>&1
rm -rf /tmp/pike.tmp
echo -e “\033[0;32;1mit’s ok\033[0m”
break
fi
done
fi
在处理一个大数据量数据库的时候
突然发现mysql对于count(*)的不同处理会造成不同的结果
比如执行
SELECT count(*) FROM tablename
即使对于千万级别的数据mysql也能非常迅速的返回结果
而对于
SELECT count(*) FROM tablename WHERE…..
mysql的查询时间开始攀升
仔细查阅累下手册,发现当没有WHERE语句对于整个mysql的表进行count运算的时候
MyISAM类型的表中保存有总的行数,而当添加有WHERE限定语句的时候Mysql需要对整个表进行检索
从而得出count的数值
突然又想起来看到的不少新兴的php程序对于count的处理并没有很好的意识到这点
记录下
顺便提下mysql的DISTINCT的关键字有很多你想不到的用处
1.在count 不重复的记录的时候能用到
比如SELECT COUNT( DISTINCT id ) FROM tablename;
就是计算talbebname表中id不同的记录有多少条
2,在需要返回记录不同的id的具体值的时候可以用
比如SELECT DISTINCT id FROM tablename;
返回talbebname表中不同的id的具体的值
3.上面的情况2对于需要返回mysql表中2列以上的结果时会有歧义
比如SELECT DISTINCT id, type FROM tablename;
实际上返回的是 id与type同时不相同的结果,也就是DISTINCT同时作用了两个字段,必须得id与tyoe都相同的才被排除了,与我们期望的结果不一样
4.这时候可以考虑使用group_concat函数来进行排除,不过这个mysql函数是在mysql4.1以上才支持的
5.其实还有另外一种解决方式,就是使用
SELECT id, type, count(DISTINCT id) FROM tablename
虽然这样的返回结果多了一列无用的count数据(或许你就需要这个我说的无用数据)
返回的结果是 只有id不同的所有结果和上面的4类型可以互补使用,就是看你需要什么样的数据了
PS:
越来越发现有很多细节是需要去探究的,
越来越发现自己写文字真的很杂乱,
有空研究下DISTINCT的效率
突然发现mysql对于count(*)的不同处理会造成不同的结果
比如执行
SELECT count(*) FROM tablename
即使对于千万级别的数据mysql也能非常迅速的返回结果
而对于
SELECT count(*) FROM tablename WHERE…..
mysql的查询时间开始攀升
仔细查阅累下手册,发现当没有WHERE语句对于整个mysql的表进行count运算的时候
MyISAM类型的表中保存有总的行数,而当添加有WHERE限定语句的时候Mysql需要对整个表进行检索
从而得出count的数值
突然又想起来看到的不少新兴的php程序对于count的处理并没有很好的意识到这点
记录下
顺便提下mysql的DISTINCT的关键字有很多你想不到的用处
1.在count 不重复的记录的时候能用到
比如SELECT COUNT( DISTINCT id ) FROM tablename;
就是计算talbebname表中id不同的记录有多少条
2,在需要返回记录不同的id的具体值的时候可以用
比如SELECT DISTINCT id FROM tablename;
返回talbebname表中不同的id的具体的值
3.上面的情况2对于需要返回mysql表中2列以上的结果时会有歧义
比如SELECT DISTINCT id, type FROM tablename;
实际上返回的是 id与type同时不相同的结果,也就是DISTINCT同时作用了两个字段,必须得id与tyoe都相同的才被排除了,与我们期望的结果不一样
4.这时候可以考虑使用group_concat函数来进行排除,不过这个mysql函数是在mysql4.1以上才支持的
5.其实还有另外一种解决方式,就是使用
SELECT id, type, count(DISTINCT id) FROM tablename
虽然这样的返回结果多了一列无用的count数据(或许你就需要这个我说的无用数据)
返回的结果是 只有id不同的所有结果和上面的4类型可以互补使用,就是看你需要什么样的数据了
PS:
越来越发现有很多细节是需要去探究的,
越来越发现自己写文字真的很杂乱,
有空研究下DISTINCT的效率
官方修理is locked:https://help.nextcloud.com/t/how-to-fix-file-is-locked-error/180356
mysql> select count(*) from oc_file_locks;
+----------+
| count(*) |
+----------+
| 99393 |
+----------+
1 row in set (0.00 sec)
DELETE FROM `oc_file_locks` WHERE 1
实践成功来自:https://blog.csdn.net/sphinx1122/article/details/110183729
故障描述:owncloud出现文件同步错误,而且一直出现owncloud server replied : locked问题,找了整个百度,没一个解决方案,直接去官网找资料,最后找到已下方法,分享下
打开owncloud 数据库
备份:oc_file_locks表(备份免错哦)
然后清空该表,客户端同步一次,故障解决
一句搞定:
以前申请了个:www.xiangdong.org 给其他人抢去了,现在访问发现返回:This URLs or Page has been blocked.
查了下:
This URLs or Page has been blocked.
中文的意思就是
这个网址或页面已被封锁
代表你所连接的这个URL(网址)不提供你相应的要求。
譬如说打开的超连接,或下载。
总结 提供下载的网页被关了
意思:URL地址或者页面被禁止。
你可以先记下你打开的这些网页地址,然后到其他人的电脑试打开这些网页。
如果别人能打开,那多半是你的杀毒软件/防火墙的设置问题了。
你可以先尝试卸载杀毒软件/防火墙,重起再打开这些网页看。
如果安装360arp防火墙之前一直是正常的,那这种情况肯定是arp防火墙设置不正确引起的,还有一个可能就是360arp防火墙跟你的杀软防火墙冲突了。先把360防火墙卸载看看能否恢复正常。
意思嘛!
这个网已关闭.
你禁止进入此网站.
冲突域(collision domain),所有直接连接在一起的,而且必须竞争以太网总线的节点都可以认为是处在同一个冲突域中,广播域(broadcast domain),广播域是一个逻辑上的计算机组,该组内的所有计算机都会收到同样的广播信息。
mysql> select count(*) from oc_file_locks;
+----------+
| count(*) |
+----------+
| 99393 |
+----------+
1 row in set (0.00 sec)
DELETE FROM `oc_file_locks` WHERE 1
实践成功来自:https://blog.csdn.net/sphinx1122/article/details/110183729
故障描述:owncloud出现文件同步错误,而且一直出现owncloud server replied : locked问题,找了整个百度,没一个解决方案,直接去官网找资料,最后找到已下方法,分享下
打开owncloud 数据库
备份:oc_file_locks表(备份免错哦)
然后清空该表,客户端同步一次,故障解决
一句搞定:
以前申请了个:www.xiangdong.org 给其他人抢去了,现在访问发现返回:This URLs or Page has been blocked.
查了下:
This URLs or Page has been blocked.
中文的意思就是
这个网址或页面已被封锁
代表你所连接的这个URL(网址)不提供你相应的要求。
譬如说打开的超连接,或下载。
总结 提供下载的网页被关了
意思:URL地址或者页面被禁止。
你可以先记下你打开的这些网页地址,然后到其他人的电脑试打开这些网页。
如果别人能打开,那多半是你的杀毒软件/防火墙的设置问题了。
你可以先尝试卸载杀毒软件/防火墙,重起再打开这些网页看。
如果安装360arp防火墙之前一直是正常的,那这种情况肯定是arp防火墙设置不正确引起的,还有一个可能就是360arp防火墙跟你的杀软防火墙冲突了。先把360防火墙卸载看看能否恢复正常。
意思嘛!
这个网已关闭.
你禁止进入此网站.
冲突域(collision domain),所有直接连接在一起的,而且必须竞争以太网总线的节点都可以认为是处在同一个冲突域中,广播域(broadcast domain),广播域是一个逻辑上的计算机组,该组内的所有计算机都会收到同样的广播信息。
摘要:嵌入式系统诞生于微型机时代,经历了漫长的独立发展的单片机道路。给嵌入式系统寻求科学的定义,必须了解嵌入式系统的发展历史,按照历史性、本质性、普遍通用性来定义嵌入式系统,并把定义与特点相区分。由于嵌入式系统应用中,对象系统的广泛性与单片机的独立发展道路,使嵌入式系统应用在客观上存在两种模式,从学科建设上,可统一成嵌入式系统应用的高低端。阅读全文
1、(好人型)遇到缠人的小女孩,要表现出比她更强的耐心,问她“多大啦?”“读书了吗?”“你爹妈呢?”“他们贵姓啊?”“你住哪里啊?”“家里还有谁呀?”……总之要慢慢的磨。最后,她们通常会红着脸和你告别:“不好意思,我要卖花去了。”
注:此法适用于较老成的人,而且要有充足的时间才行。
2、(吓人型)有一次,卖花的小女孩足足跟了三条街,我们实在没办法,只有停下来,用阴森森的语气跟她说:“小妹妹,带你去一个地方玩,好吗?”小姑娘听完掉头就跑了。
注:长的比较另类的家伙适用此法。
3、(凝眸型)卖花MM:“哥哥,买朵花给姐姐吧。”我说:“我不是她男朋友。”卖花MM:“没关系啊,你就买朵花嘛。”我说:“那买了做什么,难道送给你?”她倒是高兴了,想也不想地就说:“好啊”我只好深情地凝望她10秒钟,然后不无遗憾的告诉她:“唉,还要等10年。”最后酷酷的走掉,走到10米远,看到那小MM还在原地发愣。
注:此法适用于纯情少男。
4、(赛跑型)有一天,一个卖花MM拖着我买花,我一开始说不要,没想到小姑娘硬是把花塞到我女朋友手里,然后向我要钱。我女朋友看不过去了,就拿了花拉着我狂奔,跑了两条街,终于把她给甩开了。最后一看,花还在手里。(注:穿高跟鞋时别用这招。)
5、(广告型)不等小妹妹开口,就主动说:小妹妹,你知道“天下无贼健康钛”吗?这可是最新出的治理室内污染的新品亚。你知道你鲜花有没有被污染啊?只要用它轻轻一喷,全部可以消除污染,这样厉害,小MM你猜他卖多少钱?小MM别走呀,你还没猜价钱呢……
注:这招属于杀招,万一小MM受不了诱惑买一瓶,你就赚了。
6、(鸟语型)遇到此类情况一开始就来一段鸟语:英语,法语,德语,日语……非洲的土语也行啊,自己编的更好。只要小MM听不懂就行,加上夸张的手势,一般来说她会知难而退。日本鸟语最好:随便说一大堆,加句“米西米西,花姑娘”什么的,别忘记要露出狼外婆式的笑容哦。
注:此法极需表演天分,无天分者慎用。
7.(粗暴型)不管三七二十一,拉着卖花小姑娘的手就在街上暴走,嘴里喊着:“看我不把你卖了!”总会有躲在一边的大人跑出来认领她们的。
注:很多MM可以用这招哦。
最后一种:(BT型)此种方法也需要有极高的表演天分,并且需要有莫大的勇气(有人屡试不爽)――――先甩出个兰花指,然后用幽怨的口气说:“讨厌!人家看上去哪里像个男人啦……”小MM听后,一般都会吓得呆在原地,忘记卖花给你。
注:此法适用于较老成的人,而且要有充足的时间才行。
2、(吓人型)有一次,卖花的小女孩足足跟了三条街,我们实在没办法,只有停下来,用阴森森的语气跟她说:“小妹妹,带你去一个地方玩,好吗?”小姑娘听完掉头就跑了。
注:长的比较另类的家伙适用此法。
3、(凝眸型)卖花MM:“哥哥,买朵花给姐姐吧。”我说:“我不是她男朋友。”卖花MM:“没关系啊,你就买朵花嘛。”我说:“那买了做什么,难道送给你?”她倒是高兴了,想也不想地就说:“好啊”我只好深情地凝望她10秒钟,然后不无遗憾的告诉她:“唉,还要等10年。”最后酷酷的走掉,走到10米远,看到那小MM还在原地发愣。
注:此法适用于纯情少男。
4、(赛跑型)有一天,一个卖花MM拖着我买花,我一开始说不要,没想到小姑娘硬是把花塞到我女朋友手里,然后向我要钱。我女朋友看不过去了,就拿了花拉着我狂奔,跑了两条街,终于把她给甩开了。最后一看,花还在手里。(注:穿高跟鞋时别用这招。)
5、(广告型)不等小妹妹开口,就主动说:小妹妹,你知道“天下无贼健康钛”吗?这可是最新出的治理室内污染的新品亚。你知道你鲜花有没有被污染啊?只要用它轻轻一喷,全部可以消除污染,这样厉害,小MM你猜他卖多少钱?小MM别走呀,你还没猜价钱呢……
注:这招属于杀招,万一小MM受不了诱惑买一瓶,你就赚了。
6、(鸟语型)遇到此类情况一开始就来一段鸟语:英语,法语,德语,日语……非洲的土语也行啊,自己编的更好。只要小MM听不懂就行,加上夸张的手势,一般来说她会知难而退。日本鸟语最好:随便说一大堆,加句“米西米西,花姑娘”什么的,别忘记要露出狼外婆式的笑容哦。
注:此法极需表演天分,无天分者慎用。
7.(粗暴型)不管三七二十一,拉着卖花小姑娘的手就在街上暴走,嘴里喊着:“看我不把你卖了!”总会有躲在一边的大人跑出来认领她们的。
注:很多MM可以用这招哦。
最后一种:(BT型)此种方法也需要有极高的表演天分,并且需要有莫大的勇气(有人屡试不爽)――――先甩出个兰花指,然后用幽怨的口气说:“讨厌!人家看上去哪里像个男人啦……”小MM听后,一般都会吓得呆在原地,忘记卖花给你。