Linux使用技巧

本文介绍了平时累积的Linux使用技巧。

文件的属性

文件的隐藏属性

  • lsattr : 列出文件的隐藏属性
  • chattr : 修改文件的隐藏属性
    [[email protected] ~]# 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 SUID
2 for SGID
1 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模式,而改模式下根目录”/”是只读的,可以用如下的命令把”/”重新挂载为“读写”:

[[email protected]]# 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=100
mkswap /swapfile
vi /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-range0
BOOTPROTO=static
HWADDR=08:00:27:24:C2:72
ONBOOT=yes
IPADDR_START=192.168.56.20
IPADDR_END=192.168.56.30
NETMASK=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 - 表示当前文件名
  • $* - 以空格分离所有参数,形成一个字符串
  • [email protected] - 以空格分离所有参数,形成一个字符串组合。与$*的不同表现在被”“引用时,"$*"是一个字符串,而"[email protected]"则包含多个字符串
  • $# - 传递给进程的参数数目
  • $? - 上一条命令的执行结果,没有错误时为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 [email protected]{} 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.txt
a
A
B
b
$ sort -f a.txt
a
A
b
B
$ sort -f -s a.txt
a
A
B
b

例子中,-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 SECTIONS
The standard sections of the manual include:

1      User Commands
2      System Calls
3      C Library Functions
4      Devices and Special Files
5      File Formats and Conventions
6      Games et. Al.
7      Miscellanea
8      System Administration tools and Deamons

Distributions 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 auto
jControlPath /tmp/%[email protected]%h:%p

保存退出. 只要登录一次服务器,再在新的终端中登录同一个服务器时,就不用再输密码了。

ssh翻墙

ssh翻河蟹墙,如果你在墙外有台服务器,并且可以不用密码ssh到上面,

则可以使用ssh做端口转发,实现翻the墙。

加上Chrome上的switchy或者Firefox上的autoProxy插件就可以自由上网了。

把本地的7001端口作为转发端口:

ssh -qTfnN -D 7001 [email protected]_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 LINE
do
     echo "$LINE" >> $OUTFILE
     # do something
done < $INPUTFILE

得到一个变量代表的字符串的长度:

`echo ${#VAR}`

${PAGER:-more}

shell命令${PAGER:-more}

的意思是:如果shell变量PAGER已经定义,且其值非空,则使用其值,否则使用字符串more。

$$表示当前进程的PID.



参考资料:

时间: 2024-08-06 16:22:45

Linux使用技巧的相关文章

Linux系统技巧|对于Linux系统管理员有用的 sudoers 配置|如何配置 sudo 命令在运行时而不输入密码

本文标签:  Linux系统技巧 配置sudo命令 sudoers文件 Linux用户权限   互联网杂谈 假设你在只有自己使用的计算机上运行 Linux 系统,比如在笔记本电脑上,在每次调用 sudo 时需要输入密码,长期下来就会觉得很乏味.因此,在本指南中,我们将描述如何配置 sudo 命令在运行时而不输入密码. 此设置在 /etc/sudoers 文件中完成,这是使用 sudo命令的默认安全策略;在用户权限指定部分. 重要:在 sudeors 文件中,默认打开的 authenticate

20个 Unix/Linux 命令技巧

让我们用这些Unix/Linux命令技巧开启新的一年,提高在终端下的生产力.我已经找了很久了,现在就与你们分享. 删除一个大文件我在生产服务器上有一个很大的200GB的日志文件需要删除.我的rm和ls命令已经崩溃,我担心这是由于巨大的磁盘IO造成的,要删除这个大文件,输入: > /path/to/file.log # 或使用如下格式 : > /path/to/file.log # 然后删除它 rm /path/to/file.log 如何记录终端输出?试试使用script命令行工具来为你的终端

linux操作技巧

1.几种快速清空文件内容的方法: $ : > filename #其中的 : 是一个占位符, 不产生任何输出. $ > filename $ echo "" > filename $ echo /dev/null > filename $ echo > filename $ cat /dev/null > filename linux操作技巧,布布扣,bubuko.com

LINUX 小技巧备忘录

最近发现MDT推出去的系统的有不同问题,其问题就不说了,主要是策略权限被域继承了.比如我们手动安装的很多东东都是未配置壮态,推的就默认为安全壮态了,今天细找了一下,原来把这个关了就可以了. LINUX 小技巧备忘录,布布扣,bubuko.com

linux 小技巧总结

(1)linux判断文件是否存在 if [ -f filename]: then      ......#要执行的语句 fi 具体例子: file=/usr/local/oracle/oradata/archived_log/file.txt if [ -f $file ];then             #判断文件是否存在,存在就追加   echo $file_i >> $file   else                               #否则复写   echo $fil

Linux使用技巧5--格式化U盘

通常来说,格式化一个分区的U盘还是非常easy的.仅仅须要使用mkfs命令指定目标文件系统就能够了,样例例如以下: $ sudo fdisk -l $ sudo mkfs -t vfat /dev/sdb1 -t 參数就是目标文件格式.其它有ext3,msdos等,默觉得ext2. 我们还能够用例如以下简单命令来完毕此工作: mkdosfs(8), mke2fs(8), mkfs.bfs(8), mkfs.ext2(8), mkfs.ext3(8), mkfs.minix(8), mkfs.ms

[每天一个Linux小技巧] gdb 下一次运行多个命令

一般gdb运行的时候,我们仅仅能输入一个命令. 如: (gdb) c (gdb) bt 假设想运行多个命令怎么办? 能否像bash那样, 使用; 如 ls; ls 结论是不行. 但能够通过gdb 内建函数的的方式来实现: (gdb) def cbt >c >bt 10 >end (gdb) 也能够追加到 $HOME/.gdbinit下, 每次启动gdb后会自己主动载入. [每天一个Linux小技巧] gdb 下一次运行多个命令,布布扣,bubuko.com

Linux小技巧之man pages设置高亮颜色

默认的man pages只有一种颜色,有些文字是进行加粗的. 只需执行以下命令,即可. cat <<\EOF >> /etc/bashrc man() { env \ LESS_TERMCAP_mb=$(printf   "\e[1;31m") \ LESS_TERMCAP_md=$(printf   "\e[1;31m") \ LESS_TERMCAP_me=$(printf   "\e[0m") \ LESS_TERM

Linux小技巧之令人惊讶的命令who is sb

[root@localhost ~]# who is iroot     pts/1        2014-07-30 20:40 (172.22.150.15)[root@localhost ~]# who is sbroot     pts/1        2014-07-30 20:40 (172.22.150.15) 看到这个,瞬间蛋疼. 大家可以在监控脚本中,写上这个,纯属娱乐. Linux小技巧之令人惊讶的命令who is sb