文件chmod用法
chmod用法 时间:2021-04-05 阅读:(
)
第3章常用Shell(Bash)命令在前一章中,我们学习了Shell变量和Shell环境相关的一些知识.
想必你对LinuxShell已经有了一个初步的认识.
在这一章,我们将学习一些常用的Shell命令,应用好这些命令,将使你在Linux下执行一些任务具有事半功倍的效果.
3.
1查看文件和目录3.
1.
1ls命令实例:列出文件名和目录ls命令是Linux中最常用的命令之一.
我相信ls命令可能是你进入Linux命令行提示符时第一个输入的命令.
虽然你还没有意识到,你可能每天都在频繁地使用ls命令.
在命令行提示符下,直接输入ls命令,不带任何选项,将列出当前目录下所有文件和目录,但不会显示详细的信息,比如,文件类型、大小、修改日期和时间、权限等等:$lsacpidconman.
oldlibvirtpmsecure.
1wtmpanaconda.
logcronmailpppsecure.
2xferloganaconda.
syslogcron.
1maillogprelinksecure.
3xferlog.
1auditcron.
2maillog.
1rpmpkgssecure.
4xferlog.
2boot.
logcron.
3maillog.
2rpmpkgs.
1spoolerxferlog.
3boot.
log.
1cron.
4maillog.
3rpmpkgs.
2spooler.
1xferlog.
4boot.
log.
2cupsmaillog.
4rpmpkgs.
3spooler.
2Xorg.
0.
logboot.
log.
3dmesgmessagesrpmpkgs.
4spooler.
3Xorg.
0.
log.
oldboot.
log.
4faillogmessages.
1saspooler.
4xrdpbrcm-iscsi.
loggdmmessages.
2sambatallylogyum.
logbtmphttpdmessages.
3scrollkeeper.
logtomcat5yum.
log.
1conmanlastlogmessages.
4securevirusReport使用-1选项,将每行显示一条记录:$ls-1acpidanaconda.
loganaconda.
syslogauditboot.
logboot.
log.
1boot.
log.
2boot.
log.
3boot.
log.
4使用-l选项,将以长列表格式显示文件和目录,包括文件类型、大小、修改日期和时第3章常用Shell(Bash)命令·39·间、权限等信息:$ls-ltotal50716-rw-r-----1rootroot21630Aug1900:01acpid-rw-------1rootroot381429Oct72012anaconda.
log-rw-------1rootroot24902Oct72012anaconda.
syslogdrwxr-x---2rootroot4096Aug1822:26audit-rw-------1rootroot0Aug1804:02boot.
log-rw-------1rootroot0Aug1104:02boot.
log.
1-rw-------1rootroot0Aug404:02boot.
log.
2-rw-------1rootroot0Jul2804:02boot.
log.
3-rw-------1rootroot0Jul2104:02boot.
log.
4从上面的输出中可以看到每行有7个字段,那么每个字段的含义是什么呢下面就来介绍一下.
第一个字符——文件类型.
在上面的例子中,第一个字符有的是连字符"-",有的是字母"d".
使用ls–l命令的输出中,第一个字符可能有如下几种,其代表的含义也如下所示.
-——普通文件.
d——目录.
s——套接字文件.
l——链接文件.
字段1:文件权限.
接下来的9个字符指示文件的权限.
每3个字符分别涉及所有者、用户组和其他用户的读、写、执行权限.
例如,rw-r-----表示所有者有读和写的权限,用户组有读的权限,而其他用户没有任何权限.
字段2:链接数.
1表示只有一个链接到此文件.
字段3:所有者.
在上例中,文件的所有者均为root.
字段4:用户组.
在上例中,文件的用户组也均为root.
字段5:文件大小.
默认输出的大小单位是字节.
字段6:文件最近一次被修改的日期时间.
例如上例中,文件acpid的修改时间是Aug1900:01.
字段7:文件名.
使用-lh选项可以将文件大小显示为符合人类阅读习惯的格式:$ls-lhtotal50M-rw-r-----1rootroot22KAug1900:01acpid-rw-------1rootroot373KOct72012anaconda.
log-rw-------1rootroot25KOct72012anaconda.
syslogdrwxr-x---2rootroot4.
0KAug1822:26audit-rw-------1rootroot0Aug1804:02boot.
log-rw-------1rootroot0Aug1104:02boot.
log.
1-rw-------1rootroot0Aug404:02boot.
log.
2-rw-------1rootroot0Jul2804:02boot.
log.
3-rw-------1rootroot0Jul2104:02boot.
log.
4-rw-------1rootroot1.
1MAug1804:02cron.
1-rw-------1rootroot952KAug1104:02cron.
2-rw-------1rootroot856KAug404:02cron.
3-rw-------1rootroot1.
1MJul2804:02cron.
4第1篇LinuxShell基础和使用·40·使用-F选项,将使用不同的特殊字符归类不同的文件类型:$ls–F/libbdevid/libgmodule-2.
0.
so@cpp@libgmodule-2.
0.
so.
0@dbus-1/libgmodule-2.
0.
so.
0.
1200.
3*firmware/libgobject-2.
0.
a如上例中所示:/——表示目录.
无特殊字符——表示普通文件.
@——表示链接文件.
*——表示可执行文件.
注意:你也可以使用ls--color=auto命令,将不同的文件类型显示为不同的颜色,或将--color与-F选项联合使用.
联合使用-ld选项,可以以长列表格式列出某个目录的信息:$ls-ld/var/logdrwxr-xr-x16rootroot4096Aug2104:02/var/log使用-R选项,将递归地列出子目录的内容:$ls-R/etc/sysconfig//etc/sysconfig/:apmdcrondirqbalancenetwork-scriptssmartmontoolsapm-scriptsdesktopkernelnfssnmpd.
optionsatddundkeyboardntpdsnmptrapd.
optionsauditdfirstbootkrb524pandsyslogauthconfiggrubkudzupm-actionsysstatautofshiddlibvirtdprelinksysstat.
ioconfbluetoothhttpdlibvirt-guestsraid-checksystem-config-securitylevelcbqhwconflincaserawdevicessystem-config-userscfenvdi18nlm_sensorsreadonly-roottomcat5cfexecdinitmkinitrdrhnudev-stwcfservdip6tables-configmodulessambavncserversclockipminasdsamba.
rpmnewwpa_supplicantconmaniptablesnetconsolesaslauthdxinetdconsoleiptables-confignetworkselinuxyppasswddcpuspeedirdanetworkingsendmail/etc/sysconfig/apm-scripts:apmscript/etc/sysconfig/cbq:avpktcbq-0000.
example/etc/sysconfig/console:/etc/sysconfig/mkinitrd:multipath/etc/sysconfig/modules:other.
modulesudev-stw.
modules/etc/sysconfig/networking:第3章常用Shell(Bash)命令·41·devicesprofiles/etc/sysconfig/networking/devices:/etc/sysconfig/networking/profiles:default/etc/sysconfig/networking/profiles/default:/etc/sysconfig/network-scripts:ifcfg-eth0ifdown-ipv6ifdown-tunnelifup-ipv6ifup-routesnetwork-functionsifcfg-loifdown-isdnifupifup-ipxifup-sitnetwork-functions-ipv6ifdownifdown-postifup-aliasesifup-isdnifup-slifdown-bnepifdown-pppifup-bnepifup-plipifup-tunnelifdown-ethifdown-routesifup-ethifup-plusbifup-wirelessifdown-ipppifdown-sitifup-ipppifup-postinit.
ipv6-globalifdown-ipsecifdown-slifup-ipsecifup-pppnet.
hotplug/etc/sysconfig/rhn:sources联合使用-ltr选项,将以长列表格式按文件或目录的修改时间倒序地列出文件和目录:$ls-ltrtotal51880drwxr-xr-x2rootroot4096Jul122007conman.
olddrwxr-xr-x2rootroot4096Jul122007conmandrwx------2rootroot4096Jan222009pppdrwx------2rootroot4096Aug312010httpddrwxr-xr-x2rootroot4096Oct72012maildrwxr-xr-x2rootroot4096Oct72012pm-rw-------1rootroot24902Oct72012anaconda.
syslog-rw-------1rootroot381429Oct72012anaconda.
log-rw-------1rootroot0Oct72012tallylogdrwx------5rootroot4096Oct72012libvirt联合使用-ls选项,将以长列表格式按文件大小顺序列出文件和目录:$ls-lstotal51884-rw-r--r--1rootroot115383508Aug2110:04lastlog-rw-------1rootroot9560095Jul2804:02maillog.
4-rw-------1rootroot9557915Aug1804:02maillog.
1-rw-------1rootroot8423447Aug1104:02maillog.
2-rw-------1rootroot7380013Aug404:02maillog.
3-rw-------1rootroot4464058Aug2110:28maillog-rw-------1rootroot1413012Aug1104:00messages.
2-rw-------1rootroot1403975Aug1804:00messages.
1-rw-------1rootroot1402187Aug403:58messages.
3-rw-------1rootroot1388015Jul2804:00messages.
4使用-a选项,将列出包括隐藏文件或目录在内的所有文件和目录,包括".
"(当前目录)和".
.
"(父目录):$ls-a.
.
.
.
bash_history.
bash_logout.
bash_profile.
bashrc使用-A选项,将列出包括隐藏文件或目录(不包含".
"和".
.
")在内的所有文件和目录:第1篇LinuxShell基础和使用·42·$ls-A.
bash_history.
bash_logout.
bash_profile.
bashrc使用-i选项,将显示文件或目录的inode编号,有时在系统维护操作时,你可能想知道文件的inode编号:$ls-i/etc/1279950a2ps.
cfg1278405man.
config1280419a2ps-site.
cfg1343677maven1279260acpi1311078mc1278826adjtime1278112mgetty+sendfax注意:在find命令中,你可以使用inode编号移除文件名中含有特殊字符的文件.
使用-n选项,其输出的内容类似于-l选项,指示显示uid和gid,替代显示所有者和用户组:$ls-ntotal51964-rw-r-----10021630Aug1900:01acpid-rw-------100381429Oct72012anaconda.
log-rw-------10024902Oct72012anaconda.
syslogdrwxr-x---2004096Aug1822:26audit-rw-------1000Aug1804:02boot.
log-rw-------1000Aug1104:02boot.
log.
1-rw-------1000Aug404:02boot.
log.
2-rw-------1000Jul2804:02boot.
log.
3-rw-------1000Jul2104:02boot.
log.
43.
1.
2cat命令实例:连接显示文件内容cat命令也是Linux系统中最常使用的命令之一.
cat命令让我们可以查看文件的内容、连接文件、创建一个或多个文件和重定向输出到终端或文件.
cat命令的语法如下所示:$cat[OPTION][FILE]…使用cat命令查看文件/etc/group的内容:$cat/etc/grouproot:x:0:rootbin:x:1:root,bin,daemon显示多个文件的内容:$cat/etc/redhat-release/etc/issueScientificLinuxSLrelease5.
5(Boron)ScientificLinuxSLrelease5.
5(Boron)Kernel\ronan\m使用-n选项,可以显示文件内容的行号:$cat-n/etc/fstab1LABEL=//ext3defaults112LABEL=/local/localext3defaults123tmpfs/dev/shmtmpfsdefaults00第3章常用Shell(Bash)命令·43·4devpts/dev/ptsdevptsgid=5,mode=620005sysfs/syssysfsdefaults006proc/procprocdefaults007LABEL=SWAP-hda2swapswapdefaults00-b选项和-n选项类似,但只标识非空白行的行号.
使用-e选项,将在每一行的结尾显示"$"字符.
这个选项在需要将多行内容转换成一行时是很有用的.
$cat-e/etc/fstabLABEL=//ext3defaults11$LABEL=/local/localext3defaults12$tmpfs/dev/shmtmpfsdefaults00$devpts/dev/ptsdevptsgid=5,mode=62000$sysfs/syssysfsdefaults00$proc/procprocdefaults00$LABEL=SWAP-hda2swapswapdefaults00$当你只输入cat命令,而没有任何参数时,它只是接收标准输入的内容并在标准输出中显示(关于标准输入输出的内容,将在11.
1节中介绍).
所以在你输入一行内容并回车后,会在接下来的一行显示相同的内容.
你也可以重定向(重定向的内容将在第11章做详细介绍)标准输出到一个新文件,类似如下所示:$cat>test这时会等待用户的输入,输入需要的内容后,按Ctrl+D组合键退出.
输入的内容将会写入到文件test中.
$cat>testhelloeveryone!
$cattesthelloeveryone!
使用cat命令并利用重定向,还可以连接多个文件的内容到一个新文件,如下所示:$cattesthelloeveryone!
$cattest1helloworld!
$cattesttest1>test2$cattest2helloeveryone!
helloworld!
注意:Linux下还有一个tac命令,从命令的名字你可能已经想到,tac命令与cat命令相反,它将以倒序的形式(先显示文件的最后一行)显示文件的内容.
3.
1.
3less、more命令实例:分屏显示文件more命令在你使用小的xterm窗口时,或是想不使用文本编辑器而只是简单地阅读一第1篇LinuxShell基础和使用·44·个文件时是很有用的.
more命令是一个用于一次翻阅一整屏文件的过滤器.
使用more命令查看一个文件:$more/etc/inittab它会自动地清空屏幕并显示文件的开始部分:##inittabThisfiledescribeshowtheINITprocessshouldsetup#thesysteminacertainrun-level.
##Author:MiquelvanSmoorenburg,#ModifiedforRHSLinuxbyMarcEwingandDonnieBarnes##Defaultrunlevel.
TherunlevelsusedbyRHSare:#0-halt(DoNOTsetinitdefaulttothis)#1-Singleusermode#2-Multiuser,withoutNFS(Thesameas3,ifyoudonothavenetworking)#3-Fullmultiusermode#4-unused#5-X11#6-reboot(DoNOTsetinitdefaulttothis)#如果你按空格键,more会将文件向下移动一个你当前终端窗口的高度,来为你显示下一页的内容.
使用-num(num是一个整数)选项,可以指定一次显示的行数:$more-5/etc/inittab##inittabThisfiledescribeshowtheINITprocessshouldsetup#thesysteminacertainrun-level.
##Author:MiquelvanSmoorenburg,--More--(11%)你也可以通过管道流将cat命令显示的内容输出到more命令.
比如,有时你想输出一个文件的全部内容,但要慢慢地查看它:$catREADME|more与more命令相比,我个人更喜欢使用less命令查看文件.
less命令与more命令类似,但less命令向前和向后翻页都支持,而且less命令不需要在查看前加载整个文件,即less命令查看文件更快速.
当你尝试使用Vim编辑器和less打开同一个大的log文件,你会发现速度是不同的.
使用less命令查看一个文件:$less/etc/fstabLABEL=//ext3defaults11LABEL=/local/localext3defaults12tmpfs/dev/shmtmpfsdefaults00devpts/dev/ptsdevptsgid=5,mode=62000sysfs/syssysfsdefaults00proc/procprocdefaults00LABEL=SWAP-hda2swapswapdefaults00/etc/fstab(END)第3章常用Shell(Bash)命令·45·当你用less命令打开了一个文件后,你可以使用搜索功能,搜索指定的关键字.
默认情况下,所有匹配的关键字将会自动地高亮显示.
向前搜索:/——在less命令打开的文件中,输入字符"/"后跟要搜索的关键字,然后输入回车,显示内容的第一行将自动跳转到关键字第一次出现的位置,并高亮显示所有搜索到的关键字.
n——输入字母"n",显示内容的第一行将向前跳转到下一个匹配.
N——输入字母"N",显示内容的第一行将向回跳转到前一个匹配.
向后搜索:——与字符"/"的功能相反,在问号""后输入要搜索的关键字,然后输入回车,将向回搜索关键字.
n——向回搜索下一个匹配.
N——向前搜索下一个匹配.
在使用less命令浏览较大的文件时,可以使用如下屏幕导航命令:Ctrl+F——向前翻一个窗口的内容.
Ctrl+B——向回翻一个窗口的内容.
Ctrl+D——向前翻半个窗口的内容.
Ctrl+U——向回翻半个窗口的内容.
G——跳转到文件的末尾.
G——跳转到文件的开头.
qorZZ——退出less.
你可以使用less命令打开多个文件:$lessfile1当你查看文件file1时,使用":e"可以打开第二个文件file2:$lessfile1#somelines这时你输入":e",内容将变为:#somelinesExamine:然后你输入文件名file2:#somelinesExamine:file2然后输入回车:#thisisfile2#somelinesfile2(file2of2)(END)当你使用less命令打开了两个以上文件时,可以使用如下的关键字切换文件.
:n:跳转到下一个文件.
:p:跳转到前一个文件.
第1篇LinuxShell基础和使用·46·less命令允许你在文件的特定位置做一个标记,当需要时,可以使用这个标记再次返回到标记的位置.
m:后跟任意小写字母,使用这个字母标记当前位置.
'(单引号):后跟任意小写字母,返回到这个小写字母标记的位置.
使用less查看一个文件,并输入"m",将在窗口底部看到类似如下内容:#somelinesmark:此时输入一个小写字母将在当前位置做一个标记,当想再次回到此标记位置时,输入单引号字符"'",将在窗口底部看到类似如下内容:#somelinesgotomark:此时输入我们刚才用做标记的字母,窗口的内容将跳转到我们之前标记的位置.
一旦你已经使用less命令打开了一个文件,在此之后添加到此文件的内容将不会自动显示出来.
然而,你可以在less中输入大写字母"F"显示新写入的内容.
输入大写字母"F",在窗口的底部会显示类似如下内容:#somelinesWaitingfordata.
.
.
(interrupttoabort)3.
1.
4head命令实例:显示文件头部head命令用于打印指定输入的开头部分内容.
默认情况下,打印每个指定输入的前10行内容.
使用-n选项可以指定打印文件的前N行,如下所示:$head-n5/etc/inittab##inittabThisfiledescribeshowtheINITprocessshouldsetup#thesysteminacertainrun-level.
##Author:MiquelvanSmoorenburg,miquels@drinkel.
nl.
mugnet.
org你也可以不使用-n选项,而只是简单地在连字符"-"后跟一个正整数来指定要打印的行数,类似如下所示:$head-5/etc/inittab##inittabThisfiledescribeshowtheINITprocessshouldsetup#thesysteminacertainrun-level.
##Author:MiquelvanSmoorenburg,使用-n选项时,如果在正整数参数N前加一个连字符"-",将打印输出除最后N行以外的所有行.
类似如下所示:$cat-n/proc/meminfo1MemTotal:3850316kB2MemFree:2874464kB3Buffers:180964kB第3章常用Shell(Bash)命令·47·4Cached:674652kB5SwapCached:0kB6Active:233200kB7Inactive:652108kB8HighTotal:2973316kB9HighFree:2256976kB10LowTotal:877000kB11LowFree:617488kB12SwapTotal:4192956kB13SwapFree:4192956kB14Dirty:292kB15Writeback:0kB16AnonPages:29684kB17Mapped:19136kB18Slab:75016kB19PageTables:3132kB20NFS_Unstable:0kB21Bounce:0kB22CommitLimit:6118112kB23Committed_AS:339852kB24VmallocTotal:116728kB25VmallocUsed:11856kB26VmallocChunk:100612kB27HugePages_Total:028HugePages_Free:029HugePages_Rsvd:030Hugepagesize:2048kB$head-n-20/proc/meminfoMemTotal:3850316kBMemFree:2874340kBBuffers:180968kBCached:674652kBSwapCached:0kBActive:233204kBInactive:652108kBHighTotal:2973316kBHighFree:2256852kBLowTotal:877000kB你也可以使用-c选项打印文件的前N个字节的数据,类似如下所示:$head-c10/etc/inittab##initta$注意:-c选项和选项-n类似,在正整数N前加上连字符"-",将打印除最后N字节以外的全部字节.
3.
1.
5tail命令实例:显示文件尾部tail命令与head命令相反,它打印指定输入的结尾部分的内容.
默认情况下,它打印指定输入的最后10行内容.
使用-n选项可以指定打印文件的最后N行,如下所示:$tail-n10/etc/inittab#Rungettysinstandardrunlevels1:2345:respawn:/sbin/mingettytty1第1篇LinuxShell基础和使用·48·2:2345:respawn:/sbin/mingettytty23:2345:respawn:/sbin/mingettytty34:2345:respawn:/sbin/mingettytty45:2345:respawn:/sbin/mingettytty56:2345:respawn:/sbin/mingettytty6#Runxdminrunlevel5x:5:respawn:/etc/X11/prefdm–nodaemon使用-f选项可以即时打印文件中新写入的行.
此命令类似如下所示:$tail-f/var/log/messages注意:使用这个选项对于监控日志文件是非常有用的.
--pid选项和-f选项同时使用,可以在特定的进程结束时终结tail命令,命令类似如下所示:$tail-f/tmp/debug.
log--pid=24184有时,你有意想使用tail命令打开一个稍后才会创建或即使不可用的文件.
这时,你可以使用--retry选项持续尝试打开这个文件.
此命令类似如下所示:$tail-f/tmp/debug.
log--retrytail:warning:--retryisusefulonlywhenfollowingbynametail:cannotopen'/tmp/debug.
log'forreading:Nosuchfileordirectory如果不加--retry选项,输出将类似如下所示:$tail-f/tmp/debug.
logtail:cannotopen'/tmp/debug.
log'forreading:Nosuchfileordirectorytail:nofilesremaining$3.
1.
6file命令实例:查看文件类型file命令用于接收一个文件作为参数并执行某些测试,以确定正确的文件类型.
下面这个例子是使用file命令确定一个文件类型的基本方法:$file/etc/inittab/etc/inittab:ASCIIEnglishtext$file/etc/init.
d/network/etc/init.
d/network:Bourne-Againshellscripttextexecutable$file/usr/bin/file/usr/bin/file:ELF32-bitLSBexecutable,Intel80386,version1(SYSV),forGNU/Linux2.
6.
9,dynamicallylinked(usessharedlibs),forGNU/Linux2.
6.
9,stripped$file/etc/etc:directory使用-i选项,可以MIME类型的格式显示文件类型的信息:$file-i/etc/inittab/etc/inittab:text/plain;charset=us-ascii第3章常用Shell(Bash)命令·49·$file-i/etc/init.
d/network/etc/init.
d/network:application/x-shellscript$file-i/usr/bin/file/usr/bin/file:application/x-executable,forGNU/Linux2.
6.
9,dynamicallylinked(usessharedlibs),forGNU/Linux2.
6.
9,stripped$file-i/etc/etc:application/x-not-regular-file使用-N选项,输出的队列可以以在文件名之后无空白填充的形式显示,其格式对比如下:$file-N*a2ps.
cfg:ASCIIEnglishtexta2ps-site.
cfg:ASCIIEnglishtextacpi:directoryadjtime:ASCIItextaliases:ASCIIEnglishtextaliases.
db:writable,regularfile,noreadpermissionaliases.
ORIG:ASCIIEnglishtextalsa:directoryalternatives:directoryanacrontab:ASCIItextant.
conf:ASCIItextant.
d:directoryanthy-conf:ASCIItextasound.
state:ASCIItext,withverylonglinesat.
deny:writable,regularfile,noreadpermissionaudisp:directoryaudit:directoryauto.
agl:ASCIItextautofs_ldap_auth.
conf:writable,regularfile,noreadpermission$file*a2ps.
cfg:ASCIIEnglishtexta2ps-site.
cfg:ASCIIEnglishtextacpi:directoryadjtime:ASCIItextaliases:ASCIIEnglishtextaliases.
db:writable,regularfile,noreadpermissionaliases.
ORIG:ASCIIEnglishtextalsa:directoryalternatives:directoryanacrontab:ASCIItextant.
conf:ASCIItextant.
d:directoryanthy-conf:ASCIItextasound.
state:ASCIItext,withverylonglinesat.
deny:writable,regularfile,noreadpermissionaudisp:directoryaudit:directoryauto.
agl:ASCIItextautofs_ldap_auth.
conf:writable,regularfile,noreadpermission第1篇LinuxShell基础和使用·50·3.
1.
7wc命令实例:查看文件统计信息wc命令用于查看文件的行数、单词数和字符数等信息.
其语法类似如下所示:$wcfilenameXYZ/etc/inittabX:表示行数.
Y:表示单词数.
Z:表示字节数.
filename:表示文件名.
$wc/etc/inittab532291666/etc/inittab上述输出表示/etc/inittab文件中,有53行、229个单词和1666个字节.
使用-l选项,可以只统计文件的行数信息,如下所示:$wc-l/etc/inittab53/etc/inittab使用-w选项,可以只统计文件的单词数信息,如下所示:$wc-w/etc/inittab229/etc/inittab使用-c选项,可以只统计文件的字节数信息,如下所示:$wc-c/etc/inittab1666/etc/inittab使用-L选项,可以统计文件中最长的行的长度,如下所示:$wc-L/etc/inittab77/etc/inittab3.
1.
8find命令实例:查找文件或目录find命令是Linux系统中最重要也是最常用的命令之一.
find命令用于根据你指定的参数搜索和定位文件和目录的列表.
find命令可以在多种情况下使用,比如你可以通过权限、用户、用户组、文件类型、日期、大小和其他可能的条件来查找文件.
简单地使用find命令查找指定目录下的某个文件的方法如下所示:#find/etc-nameinittab/etc/inittab注意:此处的命令行提示符是"#"号,表示当前用户账号是root.
在当前目录下,查找名称为inittab的文件:#find.
-nameinittab.
/inittab第3章常用Shell(Bash)命令·51·找出当前目录下,文件名不区分大小写是example的所有文件:$find.
-inameexample.
/example.
/Example找出当前目录下,目录名是tmp的目录:$find.
-typed-nametmp.
/tmp找出当前目录下所有php文件:$find.
-typef-name"*.
sh".
/login.
php.
/index.
php找出当前目录下,文件权限是777的所有文件:$find.
-typef-perm0777找出当前目录下,文件权限不是777的所有文件:$find.
-typef!
-perm777找出/etc/目录下所有只读文件:#find.
-typef!
-perm/a+w找出你账号的主目录下的所有可执行文件:$find~-typef-perm/a+x找出/tmp目录下的.
log文件并将其删除:$find/tmp/-typef-name"*.
log"-execrm-f{}\;找出当前目录下的所有空文件:$find.
-typef-empty找出当前目录下的所有空目录:$find.
-typed–empty找出/tmp目录下的所有隐藏文件:$find/tmp/-typef-name".
*"找出/tmp目录下,所有者是root的文件和目录:$find/tmp/-userroot找出/tmp目录下,用户组是developer的文件和目录:$find/tmp/-groupdeveloper找出你账号的主目录下,3天前修改的文件:$find~-typef-mtime3找出你账号的主目录下,30天以前修改的所有文件:第1篇LinuxShell基础和使用·52·$find~-typef-mtime+30找出你账号的主目录下,3天以内修改的所有文件:$find~-typef-mtime-3找出你账号的主目录下,30天以前60天以内修改的所有文件:$find~-typef-mtime+30-mtime-60找出/etc目录下,一小时以内变更过的文件:#find/etc-typef–cmin-60找出/etc目录下,一小时以内访问过的文件:#find/etc-typef-amin-60找出你账号的主目录下,大小是50MB的所有文件:$find~-typef-size50MB找出你账号的主目录下,大于50MB小于100MB的所有文件:$find~-typef-size+50MB-size-100MB找出你账号的主目录下,大于100MB的文件并将其删除:$find~-typef-size+100MB-execrm–rf{}\;3.
2操作文件和目录3.
2.
1touch命令实例:创建文件在Linux中,每个文件都关联一个时间戳,并且每个文件都会存储最近一次访问的时间、最近一次修改的时间和最近一次变更的时间等信息.
所以,无论何时我们创建一个新文件,访问或修改一个已存在的文件,文件的时间戳都会自动地更新.
touch命令就可用于创建、变更和修改文件的时间戳.
它是Linux操作系统的标准程序.
touch命令有如下选项.
-a:只改变访问时间.
-c:不创建任何文件.
-m:只改变修改时间.
-r:使用指定文件的时间替代当前时间.
-t:使用[[CC]YY]MMDDhhmm[.
ss]替代当前时间.
使用touch命令创建一个名称是effyl的新的空文件(0字节):$toucheffyl使用touch命令,你同样可以创建多个文件.
例如,如下命令将创建名称分别为sheffyl、myeffyl和lueffyl的三个文件:$touchsheffylmyeffyllueffyl第3章常用Shell(Bash)命令·53·使用-a选项,可以改变或更新文件的最新访问时间.
如下命令更新文件的访问时间,如果文件effyl不存在,它将创建一个以effyl命名的新的空文件:$touch-aeffyl使用-c选项,可以避免创建一个新文件,并用当前时间更新文件的时间戳:$touch-ceffyl使用-m选项,可以只改变文件的修改时间,而访问时间不变:$touch-meffyl你可以同时使用-c和-t选项,来明确设置文件的时间,命令格式如下所示:$touch-c-tYYMMDDHHMMfilename例如,我们将文件effyl的修改时间和访问时间设置为12年12月13日10点30分:$touch-c-t1212131030effyl如果想使用文件myeffyl的时间戳更新文件effyl的时间戳,那么可以使用-r选项:$touch-rmyeffyleffyl3.
2.
2mkdir命令实例:创建目录mkdir命令用于创建一个新目录.
最基本的mkdir命令的使用方法如下所示:$mkdir上述命令将用给定的目录名在当前目录下创建一个目录.
你并不一定要在一个目录下来创建这个目录的新目录.
你可以使用相对或绝对路径来创建它们.
我们假设你在你账号的主目录,并且刚创建了一个目录backup(/home/yantaol/backup).
现在你想在backup中创建一个名为old的目录,那么你既可以使用相对路径,类似如下所示:$mkdirbackup/old也可以使用绝对路径,类似如下所示:$mkdir/home/yantaol/backup/old使用-p选项,mkdir命令会自动创建所有还不存在的父目录,比如我想在我账号的主目录的backup目录下创建一个old目录,但是backup目录还不存在,就可以使用如下命令来创建old目录:$mkdir-pbackup/old或$mkdir-p/home/yantaol/backup/old上述命令会自动创建目录backup.
如果在上述情况中,不使用-p选项,将会出现类似如下错误:第1篇LinuxShell基础和使用·54·$mkdirbackup/oldmkdir:cannotcreatedirectory'backup/old':Nosuchfileordirectory注意:当你需要递归地创建目录时,使用-p选项将是一个很简便的方法.
使用-p选项,同样可以在要创建的目录已经存在的情况下,阻止错误的发生.
比如,你要创建目录backup,但这个目录已经存在,系统将会显示类似如下错误信息:$mkdirbackupmkdir:cannotcreatedirectory'backup':Fileexists但如果你使用-p选项,将阻止错误信息的输出,类似如下所示:$mkdir-pbackup$使用-m选项,你可以设置你将要创建的目录的权限.
例如,你想创建一个任何人都有读写访问权限的目录:$mkdir-p-m777backup/old或$mkdir-p-ma=rwxbackup/old3.
2.
3cp命令实例:复制文件或目录在Linux下,我们可以使用cp命令复制文件和目录.
cp命令用于将文件从一个地方复制到另一个地方.
原来的文件保持不变,新文件可能保持原名或用一个不同的名字.
使用cp命令复制文件和目录的语法有以下几种:$cp[OPTION]SOURCEDEST#复制源文件到目标文件$cp[OPTION]SOURCE…DIRECTORY#复制一个或多个源文件到一个目录$cp[OPTION]-tDIRECTORYSOURCE…#同上例如,在当前目录下,创建一个文件file.
txt的副本,取名为newfile.
txt.
如下所示:$cpfile.
txtnewfile.
txt复制当前目录下的文件file.
txt到/tmp目录下:$cpfile.
txt/tmp/复制当前目录下的所有文件到/tmp目录:$cp*/tmp使用-p选项,可以使复制一个文件到新文件时,保留源文件的所有者、用户组、权限、修改和访问时间,以及一些扩展属性等信息:$cp-pfilename/path/to/new/location/myfile使用-R或-r选项,可以递归地复制一个目录,即将一个目录及其下的所有文件和子目录都复制到另一个目录:第3章常用Shell(Bash)命令·55·$cp-R*/home/yantaol/backup还有比较常用的归档模式复制:$cp-a*/home/yantaol/backup-a:存档模式.
相当于-dpR.
-d:保留软链接.
-p:保留权限、所有权和时间戳等信息.
-R:递归地复制目录.
3.
2.
4ln命令实例:链接文件或目录ln命令用于创建软链接或硬链接.
我们在3.
1.
1小节介绍ls命令时,讲述了ls-l命令列出的每一条目的第一个字符指示文件类型,当一个字符是"l"(小写的L)时,即表示它是一个软链接.
软链接又称符号链接,是一类特殊的文件,这个文件包含了另一个文件或目录的路径名(绝对路径或相对路径).
在对符号文件进程读或写操作时,系统会自动把该操作转换为对源文件或目录的操作,但输出链接文件时,系统仅仅删除链接文件,而不删除源文件或目录本身.
软链接可以链接不同文件系统的文件.
硬链接可以理解为一个文件的一个或多个文件名.
它引用的是文件在文件系统中的物理索引(也称为inode).
当你移动或删除原始文件时,硬链接不会被破坏,因为它所引用的是文件的物理数据而不是文件在文件结构中的位置.
硬链接的文件不需要用户有访问原始文件的权限,也不会显示原始文件的位置,这样有助于文件的安全.
如果你删除的文件有相应的硬链接,那么这个文件依然会被保留,直到所有对它的引用都被删除,即硬链接数为0.
硬链接只能链接同一文件系统中的文件.
使用-s选项,可以创建一个软链接:$ln-s/full/path/of/original/file/full/path/of/symbolic/link/fileln命令不使用任何选项,默认将创建一个硬链接:$ln-s/full/path/of/original/file/full/path/of/hard/link/file在目录/home/yantaol/lib下创建一个软链接library.
so,链接到/home/yantaol/src/library.
so:$ln-s/home/yantaol/src/library.
so/home/yantaol/lib$ls-l/home/yantaol/lib/library.
solrwxrwxrwx1yantaolyantaol29Sep419:27/home/yantaol/lib/library.
so->/home/yantaobl/src/library.
so创建目录的软链接和创建文件的软链接类似:$mkdir/home/yantaol/src$cd/tmp第1篇LinuxShell基础和使用·56·$ln–s/home/yantaol/srcsource$ls–lsourcelrwxrwxrwx1yantaolyantaol18Sep419:38source->/home/yantaol/src在当前目录下,创建文件src_original.
txt的硬链接,名称为dst_link.
txt.
两个文件的inode编码应该相同:$lnsrc_original.
txtdst_link.
txt$ls-isrc_original.
txt1638423src_original.
txt$ls-idst_link.
txt1638423dst_link.
txt注意:Linux不允许给目录创建硬链接.
当你创建一个软链接时,如果已经存在一个与此软链接同名的文件,那么你可以使用--backup选项,让ln命令在创建这个新链接之前,先备份已经存在的同名文件:$ln-ssource.
txtdst.
txtln:creatingsymboliclink'dst.
txt'to'source.
txt':Fileexists$ln--backup-ssource.
txtdst.
txt$ls-ldst.
txt*lrwxrwxrwx1yantaoblcc_rdr_tdd_0310Sep419:48dst.
txt->source.
txt-rw-r--r--1yantaoblcc_rdr_tdd_030Sep419:48dst.
txt~注意:如果你不想备份而是覆盖已经存在的文件,则使用-f选项.
3.
2.
5mv命令实例:重命名文件或目录mv命令用于将文件和目录从一个位置移到另外一个位置.
除了移动文件,mv命令还可用于修改文件或目录的名字.
mv命令的基本语法如下所示:$mvSOURCE.
.
.
DIRECTORY比如,将当前目录下的文件source.
txt移到目录/tmp下:$mvsource.
txt/tmp或将目录dir1、dir2移到目录dir_dist下:$mvdir1dir2dir_dist使用mv命令将当前目录下的文件old.
txt更名为new.
txt:$mvold.
txtnew.
txt或者将目录oldDir更名为newDir:$mvoldDirnewDir第3章常用Shell(Bash)命令·57·默认情况下,如果目标文件或目录已存在,mv命令并不会提示你任何信息,而是直接将其重写覆盖.
为了避免这个问题,可以使用-i选项,让mv命令在重写覆盖目标文件或目录之前给出提示信息.
这样你可以通过输入字符"y"或"n"来接受或拒绝此操作.
比如我准备将文件old.
txt更名为new.
txt,但是文件new.
txt已经存在,在使用-i选项时将看到类似如下结果:$mv-iold.
txtnew.
txtmv:overwrite'new.
txt'使用mv命令,也可以同时移动多个文件或目录.
比如,我想将当前目录下的所有文件移到目录/tmp下:$mv*/tmp/然而,如果想只从源目录中移动那些在目标目录中不存在的文件到目标目录,可以使用-u选项.
下面的实例,就是只将目录dir1中的文件file2和file3移到目录dir2,因为文件file1已经存在于目录dir2中了:$lsdir1/file1file2file3$lsdir2/file1$mv-udir1/*dir2/$lsdir1/file1$lsdir2/file1file2file33.
2.
6rm命令实例:删除文件或目录rm命令用于删除指定的文件和目录.
其语法如下所示:$rm[OPTIONS]…FILE…在下面这个实例中,我们使用rm命令删除文件file1.
txt、file2.
txt和file3.
txt,假设这3个文件都在当前目录下:$rmfile1.
txtfile2.
txtfile3.
txt注意:接下来的这些实例,在执行后可能会导致你的系统崩溃或数据丢失,所以请谨慎运行这些实例,并清楚你在做什么.
星号"*"可以表示所有文件名,所以使用星号"*"可以删除所有文件.
比如,删除当前目录下的所有文件:$rm*删除你当前账号主目录下的temp目录中的所有文件:第1篇LinuxShell基础和使用·58·$rm~/temp/*使用-i选项,可以让rm命令在删除每一个文件和目录前提示用户确认:$rm-i*删除当前目录下所有以".
doc"为后缀的文件:$rm*.
doc删除当前目录下所有文件名中包含"movie"字符串的文件:$rm*movie*删除当前目录下所有以小写字母"a"开头的文件:$rma*问号""用于匹配一个字符,比如,""可以表示任何只含有3个字符的文件名.
下面的例子,就是用于删除当前目录下整个文件名(包括扩展名)只有3个字符的所有文件:$rm删除当前目录下文件扩展名有两个字符的所有文件:$rm*.
方括号"[]"可以用于匹配括号内的任意一个字符.
例如,如下语句将使用rm命令删除当前目录下文件名中含有字母a,或字母b,或字母c的所有文件:$rm*[abc]*删除当前目录下文件名中包含数字0~9的所有文件.
即,文件名中至少有一个数字的文件:$rm*[0-9]*删除当前目录下文件扩展名是字母c或h的所有文件:$rm*.
[ch]删除/tmp目录下的所有文件及其子目录:$rm-rf/tmp/*-f:删除前不提示用户确认,并忽略不存在的文件.
-r(或-R):递归地删除目录及其下的内容.
3.
3管理文件或目录权限3.
3.
1ls-l:显示文件和目录权限在3.
1.
1小节中,我们学习了ls-l命令的输出,已经知道了它的输出结果中第一列的第3章常用Shell(Bash)命令·59·第一个字符表示文件的类型(目录、文件或链接),从第2~10这9个字符即指示文件的3种用户类型的权限.
-rwxr-xr-x1yantaolyantaol759Jun409:53test.
sh如上例所示,每个文件或目录都有3个用户权限组.
所有者权限(第一组的3个字符rwxr-xr-x):只应用于文件或目录的所有者,它们将不影响其他用户的行为.
用户组权限(第二组的3个字符rwxr-xr-x):只应用于已经指定给文件或目录的组,它们将同样不影响其他用户的行为.
其他用户权限(第三组的3个字符-rwxr-xr-x):只应用于系统中的所有其他用户.
每个文件或目录还有三个基本的权限类型:r:读权限.
指用户的读文件内容或列出目录内容的权限.
w:写权限.
指用户的写或修改文件或目录的权限.
x:执行权限.
指用户执行文件或进入目录的权限.
我们来看一个例子:$ls-dl/etcdrwxr-xr-x121rootroot20480Sep1008:35/etc目录/etc的权限是rwxr-xr-x.
该目录的所有者是root,用户组也同样是root.
所有者权限是rwx,这些权限允许用户root对该目录的读、写和执行访问.
用户组权限是r-x.
这里没有给写权限,所以用户组root的成员只能查看和列出目录中的内容.
他们不能在该目录中创建文件或子目录,同样不能删除任何文件或对目录内容做改动.
其他用户权限同样是r-x.
其他用户也只能查看和列出目录中的内容.
我们假设如果你看到一个目录的权限是drw-r--r--,那么该目录的所有者可以列出和修改该目录的内容,但是不能进入到这个目录,因为没有执行权限.
需要进入目录并列出目录中的内容必须有读和执行(r-x)的权限.
用户组的成员和其他用户也会有同样的问题,他们可以列出目录的内容,但是不能进入目录,因为没有执行(x)的权限.
我们再来看几个权限的例子.
-r--r--r--:这个表示所有者、用户组成员和其他用户对文件都只有读权限.
-rw-rw-rw:这个表示所有者、用户组成员和其他用户对文件有读和写的权限.
-rwxrwxrwx:这个表示所有者、用户组成员和其他用户有所有权限,他们全部可以读、写和执行此文件.
3.
3.
2chmod命令实例:修改权限chmod命令用于修改文件或目录的权限.
chmod命令根据相应的模式修改每个给定文件的权限.
这里的模式有两种:一种是符号表达式模式,另一种是八进制位模式.
使用符号表达式模式的格式如下所示:$chmod[OPTION]…[ugoa][[+-=][rwxug]FILE…第1篇LinuxShell基础和使用·60·字母"ugoa"的组合控制哪些用户对文件的访问权限将被改变.
u:指文件或目录的所有者.
g:指文件或目录的用户组的成员.
o:指不在文件或目录的用户组中的其他用户.
a:指所有用户,即(ugo).
注意:如果使用chmod命令的符号表达式模式时,不给出"ugoa"的组合,则得到的结果和使用"a"相同.
操作符"+-="表示权限的授予或撤销.
+:选定的权限将被添加.
-:选定的权限将被移除.
=:文件只拥有选定的权限.
下面我们来看几个使用符号表达式模式的chmod命令实例:移除用户组成员的写权限:$ls-lexample.
sh-rwxrwxr--1yantaolyantaol0Sep1018:40example.
sh$chmodg-wexample.
sh$ls-lexample.
sh-rwxr-xr--1yantaolyantaol0Sep1018:40example.
sh赋予其他用户执行文件的权限:$chmodo+xexample.
sh$ls-lexample.
sh-rwxr-xr-x1yantaolyantaol0Sep1018:40example.
sh只给文件的所有者写权限:$chmodu=wexample.
sh$ls-lexample.
sh--w-r-xr-x1yantaolyantaol0Sep1018:40example.
sh用文件的用户组权限替换文件的所有者权限:$chmodu=gexample.
sh$ls-lexample.
sh-r-xr-xr-x1yantaolyantaol0Sep1018:40example.
sh赋予所有人对文件读、写和执行的权限:$chmodugo+rwxexample.
shchmod命令的数字模式是用数字来表示读(4)、写(2)和执行(1)的权限,而每个用户权限组的值就是表示读、写和执行权限的这3个数字(4、2、1)组合的相加得到的八进制数(0~7).
各数字所表示的权限如下所示:4:r(读权限).
第3章常用Shell(Bash)命令·61·2:w(写权限).
1:x(执行权限).
表示rwx权限就是4+2+1=7.
表示rw-权限就是4+2+0=6.
表示r--权限就是4+0+0=4.
表示r-x权限就是4+0+1=5.
赋予所有人对文件的读、写和执行权限:$chmod777example.
sh$ls-lexample.
sh-rwxrwxrwx1yantaolyantaol0Sep1018:40example.
sh赋予文件的所有者和用户组成员读写权限,其他用户只读权限:$chmod664example.
sh$ls-lexample.
sh-rw-rw-r--1yantaolyantaol0Sep1018:40example.
sh使用-R选项,chmod命令可以递归地修改目录的权限.
比如递归地将当前目录及其下的所有文件和子目录的权限修改为775:$chmod-R775然而,如果你只想修改当前目录下的所有子目录的权限,而不修改文件的权限,你可以将chmod命令与find命令结合使用:$find.
-typed-execchmod-R775{}\;3.
3.
3chown、chgrp命令实例:修改文件所有者和用户组chown命令用于修改文件或目录的所有者和用户组信息.
其语法如下所示:$chown[OPTION]…[OWNER][:[GROUP]]FILE比如,我们将文件example.
sh的所有者修改为root:#ls-lexample.
sh-rw-rw-r--1yantaolyantaol0Sep1018:40example.
sh#chownrootexample.
sh#ls-lexample.
sh-rw-rw-r--1rootyantaol0Sep1018:40example.
sh注意:当前的命令行提示符是"#"号,表示当前用户账号是root.
将文件example.
sh的用户组也修改为root:#chown:rootexample.
sh#ls-lexample.
sh-rw-rw-r--1rootroot0Sep1018:40example.
sh同时修改文件example.
sh的所有者和用户组:第1篇LinuxShell基础和使用·62·#chownyantaol:yantaolexample.
sh#ls-lexample.
sh-rw-rw-r--1yantaolyantaol0Sep1018:40example.
sh修改软链接文件的所有者和用户组信息,我们看一下会有什么样的结果:#ls-ltmpfile_symlnklrwxrwxrwx1rootroot7Sep1111:33tmpfile_symlnk->tmpfile#ls-ltmpfile-rw-r--r--1rootroot0Sep1111:33tmpfile#chownyantaol:yantaoltmpfile_symlnk#ls-ltmpfile_symlnklrwxrwxrwx1rootroot7Sep1111:33tmpfile_symlnk->tmpfile#ls-ltmpfile-rw-r--r--1yantaolyantaol0Sep1111:33tmpfile注意:默认情况下,当你使用chown命令修改软链接文件时,它实际修改的是软链接所指向的文件.
使用-h选项,可以强制地修改软链接的所有者和用户组信息,而不是修改软链接所指向的文件的所有者和用户组信息:#ls-ltmpfile_symlnklrwxrwxrwx1rootroot7Sep1111:33tmpfile_symlnk->tmpfile#ls-ltmpfile-rw-r--r--1yantaolyantaol0Sep1111:33tmpfile#chown-hyantaol:yantaoltmpfile_symlnk#ls-ltmpfile_symlnklrwxrwxrwx1yantaolyantaol7Sep1111:33tmpfile_symlnk->tmpfile#ls-ltmpfile-rw-r--r--1yantaolyantaol0Sep1111:33tmpfile使用--from选项,可以仅在文件或目录的当前的所有者或用户组匹配所指定的用户或组时,才修改此文件或目录的所有者或用户组:#ls-ltmpfile-rw-r--r--1yantaolyantaol0Sep1111:33tmpfile#chown--from=guestroot:roottmpfile#ls-ltmpfile-rw-r--r--1yantaolyantaol0Sep1111:33tmpfile#chown--from=yantaolroot:roottmpfile#ls-ltmpfile-rw-r--r--1rootroot0Sep1111:33tmpfile#chown--from=:rootyantaol:yantaoltmpfile第3章常用Shell(Bash)命令·63·#ls-ltmpfile-rw-r--r--1yantaolyantaol0Sep1111:33tmpfile使用-R选项,chown命令可以递归地修改目录下的文件及其子目录的所有者和用户组信息.
比如,修改/root目录下的所有文件和子目录的所有者和用户组信息:#chown-Rroot:root/root如果使用chown命令递归地修改指向某个目录的软链接的所有者和用户组,让我们来看一下会发生什么情况:#ls-llinux_symlnklrwxrwxrwx1rootroot5Sep1114:40linux_symlnk->linux#ls-dllinuxdrwxr-xr-x5rootroot4096Sep1114:40linux#ls-llinux_symlnk/total12drwxr-xr-x2rootroot4096Sep1114:40libdrwxr-xr-x2rootroot4096Sep1114:40osdrwxr-xr-x2rootroot4096Sep1114:40src#chown-Ryantaol:yantaollinux_symlnk#ls-llinux_symlnklrwxrwxrwx1yantaolyantaol5Sep1114:40linux_symlnk->linux#ls-dllinuxdrwxr-xr-x5rootroot4096Sep1114:40linux#ls-llinux_symlnk/total12drwxr-xr-x2rootroot4096Sep1114:40libdrwxr-xr-x2rootroot4096Sep1114:40osdrwxr-xr-x2rootroot4096Sep1114:40src我们看到软链接的所有者和用户组已被修改,但是软链接所指向的目录并没有被修改.
这是因为默认情况下,chown命令不能横越软链接.
如果想递归地修改软链接所指向的目录的所有者或用户组,需要使用-H选项:#chown-R-Hyantaol:yantaollinux_symlnkchgrp命令与chown命令类似,但chgrp命令只用于修改文件或目录的用户组(不能修改所有者).
其语法如下所示:$chgrp[OPTION]…GROUPFILE…3.
3.
4设置setuid和setgid权限位实例:设置用户和组权限位setuid(设置用户标识)是允许用户以文件所有者的权限执行一个程序的权限位.
setgid(设置组标识)是允许用户以用户组成员的权限执行一个程序的权限位.
任意用户可以以所有者的权限,执行一个设置了setuid的脚本.
同样,任意用户可以以用户组成员的权限,执行一个设置了setgid的脚本.
第1篇LinuxShell基础和使用·64·注意:在类Unix系统中,理解setuid和setgid权限位的原理是重要的,特别是知道它们为什么被使用,更重要的是避免不当地使用它们.
当你设置setuid或setgid权限位时,一定要非常谨慎,这些权限位可能导致安全风险.
例如,用户通过执行一个设置了setuid权限位并且所有者是root的程序,可以获得超级用户的权限.
与其他权限位类似,可以使用chmod命令设置setuid和setgid权限位.
查看一个文件是否有setuid和setgid,可以使用ls-l命令或stat命令.
如果有字母"s"在所有者权限组表示设置了setuid,有字母"s"在用户组权限组则表示设置了setgid.
例如,passwd命令的权限:$ls-l/usr/bin/passwd-rwsr-xr-x1rootroot23324Aug112010/usr/bin/passwd$stat/usr/bin/passwdFile:'/usr/bin/passwd'Size:23324Blocks:48IOBlock:4096regularfileDevice:2101h/8449dInode:532483Links:1Access:(4755/-rwsr-xr-x)Uid:(0/root)Gid:(0/root)Access:2013-09-0904:02:12.
000000000+0800Modify:2010-08-1119:52:23.
000000000+0800Change:2012-10-0718:39:40.
000000000+0800使用chmod命令的符号表达式模式设置setuid:#chmodu+sexample.
sh#ls-lexample.
sh-rwsr-xr-x1rootroot0Sep1018:40example.
sh注意:当前的命令行提示符是"#"号,表示当前用户账号是root.
使用chmod命令的符号表达式模式设置setgid:#chmodg+sexample.
sh#ls-lexample.
sh-rwsr-sr-x1rootroot0Sep1018:40example.
sh使用chmod命令的数字模式设置setuid的方法是,在3个权限位的前面加数字4:#chmod4755example.
sh#ls-lexample.
sh-rwsr-xr-x1rootroot0Sep1018:40example.
sh使用chmod命令的数字模式设置setgid的方法是,在3个权限位的前面加数字2:#chmod2755example.
sh#ls-lexample.
sh-rwxr-sr-x1rootroot0Sep1018:40example.
sh使用chmod命令移除setuid和setgid权限位的方法是,在3个权限位的前面加数字0:#chmod0755example.
sh#ls-lexample.
sh-rwxr-xr-x1rootroot0Sep1018:40example.
sh第3章常用Shell(Bash)命令·65·3.
4文本处理3.
4.
1sort命令实例:文本排序sort命令用于将文本文件的行排序.
默认情况下,sort命令是按照字符串的字母顺序排序.
现在有一个包含如下内容的文件:$catexample.
txtabcdefghijklmnodef不使用任何选项,sort命令简单地将文件内容按字母顺序排序:$sortexample.
txtabcdefdefghijklmno使用-u选项,sort命令可以移除所有重复的行:$sort-uexample.
txtabcdefghijklmno上例中,重复的记录"def"被移除.
现在有一个文件,里面的内容都是数字:$catexample.
txt2010351006983直接简单地使用sort命令,将得到如下结果:$sortexample.
txt1010020356983第1篇LinuxShell基础和使用·66·在上例中,100被直接排到了10的下面,而不是按照数字的大小排在末尾.
这与sort命令的默认排序机制有关.
使用-n选项,可以使sort命令将数字按数值的大小排序:$sort-nexample.
txt1020356983100使用-r选项,可以使sort命令以倒序方式排序:$sort-n-rexample.
txt1008369352010sort命令可以同时将多个文件的内容排序:$sortfile1file2如果一个文件有多个列(下例中,每列以逗号","分隔),如下所示:$catexample.
txtabc,20def,10ghi,35jkl,100mno,69def,83默认情况下,sort命令按文件第一列的字符串字母顺序将文件内容排序:$sortexample.
txtabc,20def,10def,83ghi,35jkl,100mno,69指定sort命令按照第二列的字符串顺序将文件内容排序:$sort-t','-k2,2example.
txtdef,10jkl,100abc,20ghi,35mno,69def,83上例中,-t选项用于指定列的分隔符,上例中的列分隔符是逗号",";-k选项用于指定进行排序的列,这里我们指定的是第二列.
指定sort命令按照第二列的数值顺序将文件内容排序:第3章常用Shell(Bash)命令·67·$sort-t','-k2n,2example.
txtdef,10abc,20ghi,35mno,69def,83jkl,100指定sort命令按照第二列的数值顺序的倒序将文件内容排序:$sort-t','-k2nr,2example2.
txtjkl,100def,83mno,69ghi,35abc,20def,103.
4.
2uniq命令实例:文本去重uniq命令用于移除或发现文件中重复的条目.
现在有一个文件,其内容如下所示:$catexample.
txtaaaaaabbbbbbbbbccc使用uniq命令,不带有任何选项时,它将移除文件中重复的行并显示单一行:$uniqexample.
txtaaabbbccc使用-c选项,可以统计重复行出现的次数:$uniq-cexample.
txt2aaa3bbb1ccc使用-d选项,只显示文件中有重复的行并只显示一次:$uniq-dexample.
txtaaabbb使用-D选项,与-d选项类似,但它显示文件中所有重复的行:$uniq-Dexample.
txtaaaaaabbbbbbbbb第1篇LinuxShell基础和使用·68·使用-u选项,只显示文件中不重复的行:$uniq-uexample.
txtccc现在我们将示例文件修改成如下内容:$catexample.
txtaaabbbaaacccbbbaaabbbccccccccc使用-w选项,可以限制uniq命令只比较每行的前N个字符.
例如,下面的实例中,限制uniq命令只比较每行的前3个字符是否重复:$uniq-w3example.
txtaaabbbbbbaaacccccc使用-s选项,可以避免uniq命令比较每行的前N个字符,即跳过每行的前N个字符,只比较后面的字符.
例如,下面的实例中,避免uniq命令比较每行的前3个字符,只比较后面的字符是否重复:$uniq-s3example.
txtaaabbbaaacccbbbaaabbbccc使用-f选项,可以避免uniq命令比较前N列,即跳过前N列(这里列以空格分隔),只比较后面的字符.
例如,下面的实例中,避免uniq命令比较第一列的内容,只比较后面的字符是否重复:$uniq-f1example.
txtaaabbbaaacccbbbaaabbbccc3.
4.
3tr命令实例:替换或删除字符tr命令用于转换字符、删除字符和压缩重复的字符.
它从标准输入读取数据并将结果输出到标准输出.
tr命令的语法如下所示:$tr[OPTION]…SET1[SET2]我们首先了解一下tr命令的转换字符的功能.
如果参数SET1和SET2同时指定,并且没有指定-d选项,那么tr命令将把SET1中指定的每个字符替换为SET2中相同位置的字符.
下面这个实例用于将字符串中所有的小写字母转换为大写字母:第3章常用Shell(Bash)命令·69·$echolinuxShell|trabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZLINUXSHELL下面的实例同样可以将字符串中的所有小写字母转换为大写字母:$echolinuxShell|tr[:lower:][:upper:]LINUXSHELL还有一种方法可以得到和上例同样的结果:$echolinuxShell|tra-zA-ZLINUXSHELL使用tr命令转换一个文件中的内容,并将转换的结果输出到另一个文件:$catinputfile{linuxShell}$trinputfile>outputfile$catoutputfile(linuxShell)上例中,使用tr命令将文件inputfile中的大括号转换为了小括号,并将转换的结果输出到了文件outputfile中.
将字符串中的空格转换为制表符:$echo"Thisisfortesting"|tr[:space:]'\t'Thisisfortesting如果上例中有两个以上空格同时出现,那么tr命令将把每个空格都转换为制表符,类似如下所示:$echo"Thisisfortesting"|tr[:space:]'\t'Thisisfortesting这时,我们可以使用-s选项压缩这些重复的空格:$echo"Thisisfortesting"|tr-s[:space:]'\t'Thisisfortesting下面我们来学习使用tr命令删除指定的字符.
使用-d选项,tr命令可以删除指定的字符:$echo"TheLinuxShell"|tr-da-zTLS上例中,使用tr命令删除了字符串中的所有小写字母.
使用-d选项,删除字符串中的所有数字:$echo"myusernameisyantaol123"|tr-d[:digit:]myusernameisyantaol将-c和-d选项结合使用,删除字符串中除数字以外的所有字符:$echo"myusernameisyantaol123"|tr-cd[:digit:]123第1篇LinuxShell基础和使用·70·3.
4.
4grep命令实例:查找字符串grep命令用于搜索文本或指定的文件中与指定的字符串或模式相匹配的行.
默认情况下,grep命令只显示匹配的行.
grep命令的语法如下所示:$grep[OPTION]…PATTERN[FILE]…$grep[OPTION]…[-ePATTERN|-fFILE][FILE]…下面的实例中,我们使用grep命令查找文件/etc/passwd中账号yantaol的信息:$grepyantaol/etc/passwd会得到类似如下的输出:yantaol:x:12107:25:SDE-LiuYanTao:/home/yantaol:/bin/bash使用-i选项,可以强制grep命令忽略搜索关键字的大小写:$grep-iYantaoL/etc/passwdyantaol:x:12107:25:SDE-LiuYanTao:/home/yantaol:/bin/bash使用-r选项,可以递归搜索指定目录下的所有文件:$grep-ryantaol/etc/或者$grep-Ryantaol/etc/将-r选项与-l选项结合使用,grep命令可以只打印输出包含匹配指定模式的行的文件的名字:$grep-rlyantaol/etc//etc/passwd/etc/shadow默认情况下,当搜索字符串yantaol时,grep命令也会匹配yantaol123、yantaolb和liuyantaol等字符串.
使用-w选项,就可以强制grep命令只匹配包含指定单词的行.
比如,查找文件/etc/passwd中只包含指定单词yantaol的行,类似如下所示:$grep-wyantaol/etc/passwd使用-c选项,grep命令可以报告文件或文本中模式被匹配的次数:$grep-cyantaol/etc/passwd1使用-n选项,grep命令可以显示每一个匹配的行的行号:$grep-nyantaol/etc/passwd36:yantaol:x:12107:25:SDE-LiuYanTao:/home/yantaol:/bin/bash使用-v选项,grep命令可以输出除匹配指定模式的行以外的其他所有行:$grep-vyantaol/etc/passwd第3章常用Shell(Bash)命令·71·上例中,所有不包含字符串yantaol的行都将被打印输出.
使用--color选项,grep命令在输出中将匹配的字符串以彩色的形式标出:#grep--coloryantaol/etc/passwdyantaol:x:12107:25:SDE-LiuYanTao:/home/yantaol:/bin/bashgrep命令通常与Shell管道一起结合使用,如以下实例所示:$cat/etc/passwd|grep-iYantaoL关于管道的相关知识我们将在第12章中做详细讲解.
3.
4.
5diff命令实例:比较两个文件diff命令用于比较两个文件,并找出它们之间的不同.
diff命令的语法如下所示:$diff[OPTION]…from-fileto-file我们以如下两个文件为例,其文件内容如下:$cat-nnsswitch.
conf1passwd:filesnis2shadow:filesnis3group:filesnis456#Example-obeyonlywhatnisplustellsus.
.
.
7#services:nisplus[NOTFOUND=return]files8#networks:nisplus[NOTFOUND=return]files9#protocols:nisplus[NOTFOUND=return]files10#rpc:nisplus[NOTFOUND=return]files11#ethers:nisplus[NOTFOUND=return]files$cat-nnsswitch.
conf.
org1passwd:files2shadow:files3group:files45#hosts:dbfilesnisplusnisdns6hosts:filesdns78#Example-obeyonlywhatnisplustellsus.
.
.
9#services:nisplus[NOTFOUND=return]files10#networks:nisplus[NOTFOUND=return]files11#protocols:nisplus[NOTFOUND=return]files12#rpc:nisplus[NOTFOUND=return]files13#ethers:nisplus[NOTFOUND=return]files简单地使用diff命令比较上述两个文件的方法如下所示:$diffnsswitch.
confnsswitch.
conf.
org1,3c1,3passwd:files>shadow:files>group:files4a5,6>#hosts:dbfilesnisplusnisdns>hosts:filesdns7,11c9,13#services:nisplus[NOTFOUND=return]files>#networks:nisplus[NOTFOUND=return]files>#protocols:nisplus[NOTFOUND=return]files>#rpc:nisplus[NOTFOUND=return]files>#ethers:nisplus[NOTFOUND=return]files上例中,"1,3c1,3"表示第一个文件的1~3行与第二个文件的1~3行在内容上有差别.
""表示第二个文件的行.
"4a5,6"表示第二个文件与第一个文件相比,在第4行后多了5、6两行内容.
"7,11c9,13"表示第一个文件的7~11行与第二个文件的9~13行在内容上有差别.
你可能已经注意到,上例中的第一个文件的7~11行与第二个文件的9~13行相比,只是在":"和"nisplus"之间多了一个空格.
如果想在比较两个文件时忽略这些空格,该如何处理呢使用-w选项,diff命令就将在比较两个文件时忽略这些空格:$diff-wnsswitch.
confnsswitch.
conf.
org1,3c1,3passwd:files>shadow:files>group:files4a5,6>#hosts:dbfilesnisplusnisdns>hosts:filesdns使用-y选项,diff命令可以并排的格式输出两个文件的比较结果:$diff-ywnsswitch.
confnsswitch.
conf.
orgpasswd:filesnis|passwd:filesshadow:filesnis|shadow:filesgroup:filesnis|group:files>#hosts:dbfilesnisplusnisdns>hosts:filesdns#Example-obeyonlywhatnisplustellsus.
.
.
#Example-obeyonlywhatnisplustellsus.
.
.
#services:nisplus[NOTFOUND=return]files#services:nisplus[NOTFOUND=return]files第3章常用Shell(Bash)命令·73·#networks:nisplus[NOTFOUND=return]files#networks:nisplus[NOTFOUND=return]files#protocols:nisplus[NOTFOUND=return]files#protocols:nisplus[NOTFOUND=return]files#rpc:nisplus[NOTFOUND=return]files#rpc:nisplus[NOTFOUND=return]files#ethers:nisplus[NOTFOUND=return]files#ethers:nisplus[NOTFOUND=return]files上例中,"|"表示内容有差异的行,">"表示第二个文件中多出的行.
如果是"关于格式化选项的详细信息,请参见date命令的参考手册($mandate).
3.
5.
6id命令实例:显示用户属性id命令用于打印输出用户的uid、gid、用户名和组名等用户身份信息.
id命令的语法如下所示:$id[OPTION].
.
.
[USERNAME]直接输入id命令,将打印输出当前用户的uid、用户名、gid、组名,以及用户属于的所有群组信息:$iduid=12107(yantaol)gid=25(yantaol)groups=24(xxxx),25(yantaol)使用-u选项,id命令将只打印输出用户的uid:$id-u12107$id-uroot0将-u选项和-n选项结合使用,可以打印输出账号的用户名,而不是uid:$id-unyantaol使用-g选项,id命令将只打印输出账号当前起作用的gid:$id-g25同样,-g与-n选项结合使用,可以打印输出账号当前起作用的用户组名,而不是gid:$id-gnyantaol使用-G选项,id命令将打印输出账号所属于的所有群组的id:$id-Groot01234610875912同样,-G与-n选项结合使用,可以打印输出账号所属于的所有群组的名称:$id-Gnrootrootbindaemonsysadmdiskwheelmemlpttykmemmail第3章常用Shell(Bash)命令·79·3.
6小结下面我们总结一下本章所学的主要知识.
ls命令可以列出文件和目录的信息,包括文件类型、所有者、大小、修改日期和时间、权限等等.
cat命令可以查看文件的内容、连接文件、创建一个或多个文件和重定向输出到终端或文件.
more命令在你使用小的xterm窗口时,或是想不使用文本编辑器而只是简单地阅读一个文件时是很有用的.
它是一个用于一次翻阅一整屏文件的过滤器.
less命令与more命令类似,但less命令向前和向后翻页都支持,而且less命令不需要在查看前加载整个文件,即less命令查看文件更快速.
当你尝试使用Vim编辑器和less打开同一个大的log文件,你会发现速度是不同的.
head命令用于打印指定输入的开头部分内容.
默认情况下,打印每个指定输入的前10行内容.
tail命令与head命令相反,它打印指定输入的结尾部分的内容.
默认情况下,它打印指定输入的最后10行内容.
file命令用于接收一个文件作为参数,并执行某些测试以确定正确的文件类型.
wc命令用于查看文件的行数、单词数和字符数等信息.
find命令用于根据你指定的参数搜索和定位文件和目录的列表.
find命令可以在多种情况下使用,比如你可以通过权限、用户、用户组、文件类型、日期、大小和其他可能的条件来查找文件.
touch命令用于创建、变更和修改文件的时间戳.
它是Linux操作系统的标准程序.
mkdir命令用于创建一个新目录.
cp命令用于将文件从一个地方复制到另一个地方.
原来的文件保持不变,新文件可能保持原名或用一个不同的名字.
ln命令用于创建软链接或硬链接.
mv命令用于将文件和目录从一个位置移到另外一个位置.
除了移动文件,mv命令还可用于修改文件或目录的名字.
rm命令用于删除指定的文件和目录.
chmod命令用于修改文件或目录的权限.
chown命令用于修改文件或目录的所有者和用户组信息.
chgrp命令与chown命令类似,但chgrp命令只用于修改文件或目录的用户组(不能修改所有者).
setuid(设置用户标识)是允许用户以文件所有者的权限执行一个程序的权限位.
setgid(设置组标识)是允许用户以用户组成员的权限执行一个程序的权限位.
第1篇LinuxShell基础和使用·80·sort命令用于将文本文件的行排序.
默认情况下,sort命令是按照字符串的字母顺序排序.
uniq命令用于移除或发现文件中重复的条目.
tr命令用于转换字符、删除字符和压缩重复的字符.
它从标准输入读取数据并将结果输出到标准输出.
grep命令用于搜索文本或指定的文件中与指定的字符串或模式相匹配的行.
diff命令用于比较两个文件,并找出它们之间的不同.
hostname命令用于查看系统的主机名,或是修改系统的主机名.
w命令用于显示登录的用户及他们当前运行的进程.
who命令有与w命令类似的用途,但它的功能比w命令更强大一些.
uptime命令用于打印系统的运行时间等信息.
uname命令用于打印内核名称和版本、主机名等系统信息.
date命令用于以多种格式显示日期和时间,或设置系统的日期和时间.
id命令用于打印输出用户的uid、gid、用户名和组名等用户身份信息.
提速啦(www.tisula.com)是赣州王成璟网络科技有限公司旗下云服务器品牌,目前拥有在籍员工40人左右,社保在籍员工30人+,是正规的国内拥有IDC ICP ISP CDN 云牌照资质商家,2018-2021年连续4年获得CTG机房顶级金牌代理商荣誉 2021年赣州市于都县创业大赛三等奖,2020年于都电子商务示范企业,2021年于都县电子商务融合推广大使。资源优势介绍:Ceranetwo...
目前国内云计算市场竞争异常激烈,尤其是国内的腾讯云、阿里云、景安等商家促销活动一波接一波的进行,对于有需要的用户确实得到不小的实惠。但是这样给予国内的主机商确实是比较大的打击,毕竟这些商家的背景和实例强劲,即便是贴本补贴优惠,也是不怕的。前两年阿里一家各种活动促销,确实在国内市场占据主要的市场地位,腾讯云开始两年没有较大的吸引用户,不过这两年的发展还是比较稳健的。我们很多网友在之前肯定也享受到一些...
gigsgigsCloud日本东京软银VPS的大带宽配置有100Mbps、150Mbps和200Mbps三种,三网都走软银直连,售价最低9.8美元/月、年付98美元。gigsgigscloud带宽较大延迟低,联通用户的好选择!Gigsgigscloud 日本软银(BBTEC, SoftBank)线路,在速度/延迟/价格方面,是目前联通用户海外VPS的最佳选择,与美国VPS想比,日本软银VPS延迟更...
chmod用法为你推荐
多家五星酒店回应网传名媛拼单拼多多商家出钱叫买家好评会被处罚吗小度商城小度在家智能屏Air性价比高吗?懂行的进~嘀动网在炫动网买鞋怎么样,是真的吗www.78222.com我看一个网站.www.snw58.com里面好有意思呀,不知道里面的信息是不是真实的百度指数词百度指数为0的词 为啥排名没有se9999se.comexol.smtown.comm88.comm88.com现在的官方网址是哪个啊 ?m88.com分析软件?dadi.tv智能网络电视smartTV是什么牌子www4399com4399网站是什么dpscyclewow3.13术士的PVE的命中多少够了?
什么是域名地址 hostigation 唯品秀 photonvps 狗爹 韩国空间 kddi parseerror hostker 双十一秒杀 100m独享 免费申请网站 cdn加速是什么 爱奇艺vip免费领取 www789 什么是web服务器 php服务器 阿里云手机官网 如何登陆阿里云邮箱 服务器硬件配置 更多