Linux使用技巧

本文发布时间: 2019-Mar-22
本文介绍了平时累积的Linux使用技巧。文件的属性文件的隐藏属性lsattr : 列出文件的隐藏属性chattr : 修改文件的隐藏属性[root@www ~]# chattr [+-=][ASacdistu] FileName+ : Add one attribute- : Remove one attribute= : Set to be the only attributes that the files have重要选项a:只能追加文件的内容,但不能修改或删除内容 i:文件不能被删除、改名、不能创建指向它的链接,不能向文件写内容文件的特殊权限 SUID/SGID/Sticky Bit如果对一个可执行文件设置了SUID或者SGID位,则文件执行时,将会拥有文件所有者(设置了SUID)或者所在组(设置了SGID)的权限。例子:普通用户不能开启httpd服务,因为httpd服务需要用到80端口,而1024以下的端口只有root用户才能使用。如果我们把httpd可执行文件的所有者设置为root,同时设置SUID位,则普通用户也可以开启httpd服务了。对一个目录设置了Sticky位,则只有文件的所有者能删除这个文件。在Linux系统中,/tmp目录默认设置了这个位:drwxrwxrwt 12 root root 16384 Mar 6 09:04 tmp/主要使用方法如下:SUID对于文件:以文件所有者的权限运行 对于目录:不能对目录设置SUID设置SUID:chmod u+s FILE chmod 4755 FILESGID对于文件:以文件所属组的权限运行 对于目录:目录里面的文件会继承目录的属性设置SGID:chmod g+s FILE/DIR chmod 2771 FILE/DIRSticky对于文件:不能对文件设置Sticky位 对于目录:对于该目录下的文件,只有它们的所有者才能删除它们。设置Sticky:chmod o+t DIR chmod 1777 DIR用字母设置特殊权限:u+s g+s o+t用数字表示特殊权限,则是:4 for SUID2 for SGID1 for Sticky脚本的特殊权限需要注意的是,shell、python、perl等脚本文件不能设置SUID位,因为它们事实上是由bash、python、perl解释器解释运行的。要让脚本文件也有类似于SUID这样的功能,我们需要一层壳,这层壳可以设置SUID/SGID位,壳里面真正工作的还是脚本。比如说我们有一个脚本/home/jh/bin/myscript.sh,所有者是普通用户,但脚本里面的操作需要root权限,现在我们用C语言来写这层壳,名称叫做transeuid.c:/** author: JH Gao <[email protected]>* Create Date: 2012-06-05* Function: transmit euid and egid to other scripts* since shell/python/... scripts can't get suid permission in Linux*/#include <stdio.h>#include <stdlib.h>#include <unistd.h>#define BUFFSIZE 1024/** usually euid is the uid who run the program* but when stick is setted to the program* euid is the uid or the program's owner*/int main(int argc, char *argv[]) { char *cmd = '/home/jh/bin/myscript.sh'; char *pars[] = {'/home/jh/bin/myscript.sh', 'par1', 'par2'}; /* set uid and gid to euid and egid */ setuid(geteuid()); setgid(getegid()); if (execvp(cmd, pars)) { printf('error'); free(cmd); exit(1); } free(cmd);}编译这个程序,在给这个程序设置希望取得的用户,再设置suid,然后就可以用这个用户的权限执行脚本或命令了:$ gcc -t transeuid transeuid.c$ sudo chown root transeuid$ sudo chmod +s transeuid$ ./transeuid ......DO SOMETHING但是需要注意的是,这种花招有很大的安全隐患。/etc/fstab文件出错怎么办此时,系统不能正常启动,此时可以启动进入single user模式,而改模式下根目录”/”是只读的,可以用如下的命令把”/”重新挂载为“读写”:[root@linux]# mount -n -o remount,rw /-n : mount but do not change /etc/mtab-o : optionspartprobe–不用重启使用新的分区表partprobe : reinitializes the kernel in memory of the partition table.更改分区设置后,系统提示需要重启以更改kernel中的分区表,利用partprobe即可免除重启。ubuntu系统在GDM和KDM之间切换如果你同时安装了GNOME和KDE,有时候需要在gdm和kdm之间切换:sudo dpkg-reconfigure gdm增加swap空间创建一个新的分区或新的文件 用mkswap工具写入特殊标记 在/etc/fstab中加入新的记录 激活swap分区,命令swapon -a 或者 swapon [SWAPFILE] 用swapon -s 命令检查swap分区的状态例子:dd if=/dev/zero of=/swapfile bs=1M count=100mkswap /swapfilevi /etc/fstab ...swapon -a一个网卡绑定多个IP例子:系统是CentOS, 网卡是eth0,如果只要额外设置1个IP,则创建文件/etc/sysconfig/network-scripts/ifcfg-eth0:0,在该文件中设置IP信息。如果需要设置一个IP段,则创建文件ifcfg-ethX-rangeX:ifcfg-eth0-range0:DEVICE=eth0-range0BOOTPROTO=staticHWADDR=08:00:27:24:C2:72ONBOOT=yesIPADDR_START=192.168.56.20IPADDR_END=192.168.56.30NETMASK=255.255.255.0lsoflsof命令可以列出所有打开的文件。这个命令最常用的功能是找到“丢失”的空间。比如我们用df命令看到 /home分区只剩下1G了, 但用du命令得到的结果是应该还有5G才对,这种情况往往是由于一些文件被删除,但这些被删除的文件的文件句柄还没有被释放导致的。用命令lsof | grep -i deleted查看有哪些文件被删除了但文件句柄还没释放,kill或者重启响应的进程就能找回“丢失”的空间。lsof有时候还能恢复被误删除的文件,具体方法请google.目录长度目录的长度从来不会是0,因为它总是包含.和..两项。符号连接的长度指其路径名包含的字符数,由于路径名中至少有一个字符,所以长度也不为0.创建一个名为“-f”的文件夹要创建一个名为“-f”的文件夹,使用命令mkdir -f必然失败,而用mkdir -- -f则可以创建成功.用”cd -“在最近使用的两个目录间切换su 和 su - 的区别执行su时新shell将继承当前的shell环境,su -模拟实际的root登陆会话快速清除historyexport HISTSIZE=0bash中的$相关参数$0 - 表示当前文件名 $* - 以空格分离所有参数,形成一个字符串 $@ - 以空格分离所有参数,形成一个字符串组合。与$*的不同表现在被”“引用时,'$*'是一个字符串,而'$@'则包含多个字符串 $# - 传递给进程的参数数目 $? - 上一条命令的执行结果,没有错误时为0 $$ - 本条命令的PIDbash技巧,由变量的内容来组合为另一个变量的变量名EXAMPLE:A_B_C_D='something't1='B't2='_D'eval echo $A_${t1}_C${t2};bash命令行输入技巧使用Ctrl+R来搜索以前用过的命令使用Ctrl+W删除当前单次使用Ctrl+U删除当前行xargsxargs很强大,用 -l{} 可以指定参数的位置:cat hosts | xargs -I{} ssh root@{} hostname写安全的bash脚本最常用的是:set -e,当有错误发生时,脚本会退出 set -u,当bash发现有没有初始化的变量时就退出更多可参考:写出健壮的Bash脚本tar打包指定列表中列出的文件cat yourlist.lst/etc/fstab/home/admin/bin/somefile.sh/home/mysql/somefile...tar cvzf xxx.tar.gz -T yourlist.lst指定一个DNS服务器查询域名记录dig @8.8.8.8 www.google.comsort命令最需要注意的参数是-k和-s:-s, --stable stabilize sort by disabling last-resort comparisonstable表示最终的顺序依赖于原来的顺序。$ cat a.txtaABb$ sort -f a.txtaAbB$ sort -f -s a.txtaABb例子中,-f表示不区分大小写,-s表示顺序依赖于原来文件的顺序-k, --key=POS1[,POS2] start a key at POS1 (origin 1), end it at POS2 (default end of line).所以只以第二列来排序应该写:sort -k1,1更多关于sort的技巧,可以参考Sort Files Like A Master With The Linux Sort Command (Bash)man的使用man page可能有好几个section,比如这个:$ man -aw man/usr/share/man/man1/man.1.gz/usr/share/man/man7/man.7.gz就有2个section。在man page中也经常看到类似于:SEE ALSO epoll_create(2), epoll_create1(2), epoll_ctl(2), epoll_wait(2)括号里面的数字就是指section。不同的section代表不同类别的内容:MANUAL SECTIONSThe standard sections of the manual include:1 User Commands2 System Calls3 C Library Functions4 Devices and Special Files5 File Formats and Conventions6 Games et. Al.7 Miscellanea8 System Administration tools and DeamonsDistributions customize the manual section to their specifics,which often include additional sections.查看第7个section:man 7 manmplayer字符播放:mplayer -vo aa xxx.avi 用无颜色的字符播放;mplayer -vo caca xxx.avi 用有颜色的ASCII字符播放;mplayer -vo matrixiew xxx.avi 用类似黑客帝国里面的终端播放!自定义的终端自动补全比如我要对ssh, ping, myscript这三个命令自动补全参数,其中参数名都写在了/tmp/my_word_list文件中,我们可以在 .bashrc中做如下设置:function _my_cmpl() { local my_cmpl_words cur COMPREPLY=() cur='${COMP_WORDS[COMP_CWORD]}' my_cmpl_words=`cat /tmp/my_word_list` COMPREPLY=( $( compgen -W '$my_cmpl_words' -- '$cur' ) )}complete -F _my_cmpl ssh ping myscriptssh保存会话vi /home/用户名/.ssh/config (没有就新建一个),加入以下内容:jHost *jControlMaster autojControlPath /tmp/%r@%h:%p保存退出. 只要登录一次服务器,再在新的终端中登录同一个服务器时,就不用再输密码了。ssh翻墙ssh翻河蟹墙,如果你在墙外有台服务器,并且可以不用密码ssh到上面,则可以使用ssh做端口转发,实现翻the墙。加上Chrome上的switchy或者Firefox上的autoProxy插件就可以自由上网了。把本地的7001端口作为转发端口:ssh -qTfnN -D 7001 root@YOUR_SERVER第一个参数作为函数名调用函数func_eval() { TYPE=`type $1 | head -1 | awk '{print $NF}'` if [ $? -gt 0 ]; then echo 'ERROR call function: $1 ... failed' elif [ '$TYPE' == 'function' ]; then eval $* else echo 'ERROR invalid function: $1 ...' exit 1 fi}逐行处理文件的最易懂且高效的方法:while read LINEdo echo '$LINE' >> $OUTFILE # do somethingdone < $INPUTFILE得到一个变量代表的字符串的长度:`echo ${#VAR}`${PAGER:-more}shell命令${PAGER:-more}的意思是:如果shell变量PAGER已经定义,且其值非空,则使用其值,否则使用字符串more。$$表示当前进程的PID.参考资料:http://www.quora.com/Linux/What-are-some-time-saving-tips-that-every-Linux-user-should-know http://article.yeeyan.org/view/58906/257928 http://www.skorks.com/2010/05/sort-files-like-a-master-with-the-linux-sort-command-bash/


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2024-Mar-04 02:09pm
栏目列表