知识屋:更实用的电脑技术知识网站
所在位置:首页 > 操作系统 > linux

Linux使用技巧

发布时间:2015-05-27 19:10:09作者:知识屋

本文介绍了平时累积的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 FILE

SGID

对于文件:以文件所属组的权限运行 对于目录:目录里面的文件会继承目录的属性

设置SGID:

chmod g+s FILE/DIR chmod 2771 FILE/DIR

Sticky

对于文件:不能对文件设置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 * 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 #include #include #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 : options

partprobe–不用重启使用新的分区表

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.0

lsof

lsof命令可以列出所有打开的文件。这个命令最常用的功能是找到“丢失”的空间。

比如我们用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登陆会话

快速清除history

export HISTSIZE=0

bash中的$相关参数

$0 - 表示当前文件名 $* - 以空格分离所有参数,形成一个字符串 $@ - 以空格分离所有参数,形成一个字符串组合。与$*的不同表现在被”“引用时,"$*"是一个字符串,而"$@"则包含多个字符串 $# - 传递给进程的参数数目 $? - 上一条命令的执行结果,没有错误时为0 $$ - 本条命令的PID

bash技巧,由变量的内容来组合为另一个变量的变量名

EXAMPLE:

A_B_C_D="something"t1="B"t2="_D"eval echo /$A_${t1}_C${t2};

bash命令行输入技巧

使用Ctrl+R来搜索以前用过的命令
使用Ctrl+W删除当前单次
使用Ctrl+U删除当前行

xargs

xargs很强大,用 -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.com

sort命令最需要注意的参数是-k和-s:

-s, --stable              stabilize sort by disabling last-resort comparison

stable表示最终的顺序依赖于原来的顺序。

$ 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 man

mplayer字符播放:

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 myscript

ssh保存会话

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.


 

(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜