Shell 命令笔记

find 命令 rm 删除某目录下所有子目录中的某类文件

1
2
3
4
find . -name "test.file" -exec rm -rf {} \;
# or
find . -name "test.file" | xargs rm -rf;

解决 Mac XAMPP Mysql 无法启动问题

1
2
3
ps -ef | grep mysqld # 得到相应进程 PID
sudo kill PID
sudo /Applications/XAMPP/xamppfiles/bin/mysql.server start

复制到剪贴板

1
pbcopy < ~/.ssh/id_rsa.pub

根据端口杀死进程 shell 脚本

1
2
3
4
5
# 查看端口号所使用的进程号
lsof -i:8080
# 杀死指定端口进程
kill -9 $pid

创建和删除软、硬链接

1
2
3
4
5
6
7
8
# 硬链接
ln src dist
# 软链接
ln -s src dist
# 删除链接,注意不是rm -rf symbolic_name/
rm -rf symbolic_name

linux 软连接和硬链接的区别:

  1. 软连接可以跨文件系统,硬连接不可以。

    实践的方法就是用共享文件把 windows 下的 aa.txt 文本文档连接到 linux 下 /root 目录 下 bb,cc . ln -s aa.txt
    /root/bb 连接成功 。ln aa.txt /root/bb 失败 。

  2. 关于 I 节点的问题 。硬连接不管有多少个,都指向的是同一个 I 节点,会把结点连接数增加 ,只要结点的连接数不是 0,文件就一直存在 ,不管你删除的是源文件还是连接的文件。只要有一个存在 ,文件就存在(其实也不分什么源文件连接文件的,因为他们指向都是同一个 I 节点)。

    当你修改源文件或者连接文件任何一个的时候 ,其他的文件都会做同步的修改。软链接不直接使用i节点号作为文件指针,而是使用文件路径名作为指针。所以删除连接文件对源文件无影响,但是删除源文件,连接文件就会找不到要指向的文件。软链接有自己的inode,并在磁盘上有一小片空间存放路径名.

  3. 软连接可以对一个不存在的文件名进行连接。

  4. 软连接可以对目录进行连接。

备注:I 节点:它是 UNIX 内部用于描述文件特性的数据结构。我们通常称 I 节点为文件索引结点(信息结点)。I 节点含有关于文件的大部分的重要信息,包括文件数据块在磁盘上的地址。每一个I节点有它自己的标志号,我们称为文件顺序号。I 节点包含的信息 1.文件类型 2.文件属主关系 3.文件的访问权限 4.文件的时间截。

统计当前文件夹下的文件/目录个数

  • 统计当前文件夹下文件的个数:ls -l | grep "^-" | wc -l
  • 统计当前文件夹下目录的个数:ls -l | grep "^d" | wc -l
  • 统计当前文件夹&子文件夹下文件的个数:ls -l | grep "^-" | wc -l
  • 统计当前文件夹&子文件夹下目录的个数:ls -l | grep "^d" | wc -l

Linux 下查看文件和文件夹大小的 df 和 du 命令

  • df 可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力

  • du 可以查看文件及文件夹的大小

两者配合使用,非常有效。比如用 df 查看哪个一级目录过大,然后用 du 查看文件夹或文件的大小,如此便可迅速确定症结

df 命令可以显示目前所有文件系统的可用空间及使用情形,栗子:

1
2
3
4
5
6
7
8
9
10
[jimco@jimco-pro ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 3.9G 300M 3.4G 8% /
/dev/sda7 100G 188M 95G 1% /data0
/dev/sdb1 133G 80G 47G 64% /data1
/dev/sda6 7.8G 218M 7.2G 3% /var
/dev/sda5 7.8G 166M 7.2G 3% /tmp
/dev/sda3 9.7G 2.5G 6.8G 27% /usr
tmpfs 2.0G 0 2.0G 0% /dev/shm

参数 -h 表示使用「Human-readable」的输出,也就是在档案系统大小使用 GB、MB 等易读的格式

上面的命令输出的第一个字段(Filesystem)及最后一个字段(Mounted on)分别是档案系统及其挂入点。我们可以看到 /dev/sda1 这个分割区被挂在根目录下

接下来的四个字段 Size、Used、Avail、及 Use% 分别是该分割区的容量、已使用的大小、剩下的大小、及使用的百分比。 FreeBSD下,当硬盘容量已满时,您可能会看到已使用的百分比超过 100%,因为 FreeBSD 会留一些空间给 root,让 root 在档案系统满时,还是可以写东西到该档案系统中,以进行管理

du:查询文件或文件夹的磁盘使用空间

如果当前目录下文件和文件夹很多,使用不带参数 du 的命令,可以循环列出所有文件和文件夹所使用的空间。这对查看究竟是那个地方过大是不利的,所以得指定 深入目录的层数,参数:–max-depth=,这是个极为有用的参数。如下,注意使用 ‘*’,可以得到文件的使用空间大小:

注意:一向命令比 linux 复杂的 FreeBSD,它的 du 命令指定深入目录的层数却是比 linux 简化,为 -d

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[jimco@jimco-pro ~]# du -h --max-depth=1 work/testing
27M work/testing/logs
35M work/testing
[jimco@jimco-pro ~]# du -h --max-depth=1 work/testing/*
8.0K work/testing/func.php
27M work/testing/logs
8.1M work/testing/nohup.out
8.0K work/testing/testing_c.php
12K work/testing/testing_func_reg.php
8.0K work/testing/testing_get.php
8.0K work/testing/testing_g.php
8.0K work/testing/var.php
[jimco@jimco-pro ~]# du -h --max-depth=1 work/testing/logs/
27M work/testing/logs/
[jimco@jimco-pro ~]# du -h --max-depth=1 work/testing/logs/*
24K work/testing/logs/errdate.log_show.log
8.0K work/testing/logs/pertime_show.log
27M work/testing/logs/show.log
  • du 统计文件大小相加

  • df 统计数据块使用情况

如果有一个进程在打开一个大文件的时候,这个大文件直接被 rm 或者 mv 掉,则 du 会更新统计数值,df 不会更新统计数值,还是认为空间没有释放。直到这个打开大文件的进程被 kill 掉

Centos6.x 安装 Git

  1. 安装编译git时需要的包

    1
    2
    3
    $ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
    $ yum install gcc perl-ExtUtils-MakeMaker
  2. 删除已有的 git

    1
    $ yum remove git
  3. 下载 git 源码

    1
    2
    3
    $ cd ~
    $ wget https://www.kernel.org/pub/software/scm/git/git-2.9.3.tar.gz
    $ tar xzf git-2.9.3.tar.gz
  4. 编译安装

    1
    2
    3
    4
    5
    $ cd git-2.9.3
    $ make prefix=/usr/local/git all
    $ make prefix=/usr/local/git install
    $ echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc
    $ source /etc/bashrc
  5. 检查一下版本号

    1
    $ git --version

Centos6.x 安装 Node.js

使用已编译版本安装:

  1. 下载安装包:

    wget http://nodejs.org/dist/v7.9.0/node-v7.9.0-linux-x64.tar.gz

  2. 解压:

    tar zxvf node-v7.9.0-linux-x64.tar.gz -C /user/local/node

  3. 修改目录名:

    cd /user/local/node && sudo mv node-v7.9.0-linux-x64 7.9.0

  4. 配置软链接/PATH:

    1
    2
    sudo ln -s /usr/local/node/7.9.0/bin/node /usr/local/bin/node
    sudo ln -s /usr/local/node/7.9.0/bin/npm /usr/local/bin/npm

    or

    1
    2
    3
    4
    5
    6
    7
    8
    $ vim /etc/profile
    # 在 'export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL' 这一行的上面添加
    export NODE_HOME=/usr/local/node/7.9.0
    export PATH=$NODE_HOME/bin:$PATH
    # wq 保存退出后执行
    $ source /etc/profile

    注意:执行 sudo npm install -g pm2 报错 sudo:pm2:找不到命令 是因为 sudo 运行时,会默认重置环境变量为安全的环境变量,也即,当前设置的变量都会失效。sudo -l 查看 sudo 的 secure_path,将要 sudo 执行的命令 symlink 到相应的 secure_path,或者 sudo vim /etc/sudoers 修改 secure_path 值即可解决。

  5. 测试是否安装成功:node -v

Linux mail 命令

语法

mail (选项) (参数)

选项

1
2
3
4
5
6
7
8
9
10
11
-e: 测试系统邮箱内是否有邮件
-b<地址>: 指定密件副本的收信人地址
-c<地址>: 指定副本的收信人地址
-f<邮件文件>: 读取指定邮件文件中的邮件
-i: 不显示终端发出的信息
-I: 使用互动模式
-n: 程序使用时,不使用mail.rc文件中的设置
-N: 阅读邮件时,不显示邮件的标题
-s<邮件主题>: 指定邮件的主题
-u<用户帐号>: 读取指定用户的邮件
-v: 执行时,显示详细的信息

实例

  1. 直接使用shell当编辑器

    1
    2
    3
    mail -s "Hello from test.com by shell" admin@test.com
    hello,this is the content of mail.
    welcome to www.test.com

    第一行是输入的命令,-s 表示邮件的主题,后面的 admin@test.com 则是邮件的接收人,输入完这行命令后回车,会进入邮件正文的编写,我们可以输入任何文字,比如上面的两行。当邮件正文输入完成后,需要按CTRL+D 结束输入,此时会提示你输入 Cc 地址,即邮件抄送地址,没有直接回车就完成了邮件的发送。

  2. 使用管道进行邮件发送

    1
    echo "hello, this is the content of mail.welcome to www.test.com" | mail -s "Hello from test.com by pipe" admin@test.com

    使用管道直接敲入这行命令即可完成邮件的发送,其中echo后的是邮件正文。

  3. 使用文件进行邮件发送

    mail -s "Hello from test.com by file" admin@test.com < mail.txt

    使用上面的命令后,我们就可以把 mail.txt 文件的内容作为邮件的内容发送给 admin@test.com 了。

    使用上述三种方式都可以给外部邮箱进行邮件发送,但因为前面 2 中都是直接在 shell 中敲入邮件内容,因此无法输入中文,即使我们使用粘贴的方式输入了中文,那么收到的邮件也是乱码的。但第 3 种方式,我们可以在 window 下编辑好邮件内容后,放到 linux 下,再进行发送,这样就可以正常发送中文了。不过目前邮件的中文标题暂时没有找到解决办法。

  4. 传送电子邮件给本系统用户

    语法:mail {用户名}

  5. 将信件送给一个或以上的电子邮件地址

    1
    mail user1@email.address user2

    由于没有加入其他的选项,使用者必须输入标题与信件的内容等。而 user2 没有主机位置,就会送给邮件服务器的 user2 使用者。

    1
    mail -s 标题 -c user1 user2 < mail.txt

    将 mail.txt 的内容寄给 user2 同时 cc 给 user1 。如果将这一行指令设成 cronjob 就可以定时将备忘录寄给系统使用者。

  6. 检查所传送的电子邮件是否送出,或滞留在邮件服务器中

    1
    /usr/lib/sendmail -bp

    若屏幕显示为 “Mail queue is empty” 的信息,表示 mail 已送出;若为其他错误信息,表示电子邮件因故尚未送出。

很多情况下,我们也需要使用邮件来发送附件,在 linux 下使用 mail 命令发送附件也很简单,不过首先需要安装 uuencode 软件包,这个程序是对二进制文件进行编码使其适合通过邮件进行发送,在 CentOS 上安装该软件包如下:

yum install sharutils

安装完成后我们就可以来进行附件的发送了,使用如下命令:

1
uuencode test.txt test | mail -s "hello,see the attachement" admin@test.com

完成后就可以把 text.txt 文件作为邮件的附件发送出去了。uuencode 有两个参数,第一个是要发送的文件,第二个是显示的文件名称。

阅读邮件

Linux 下 mail 命令收集系统收到邮件都会保存在 “/var/spool/mail/[linux用户名]” 文件中。在 linux 中输入 mail,就进入了收件箱,并显示邮件列表。此时命令提示符为 &

& help

如果不会使用或者忘记了什么命令,就输入 help 或者 ? 来获取帮助,还可以输入以下命令对邮件进行相关操作:

  • ? | help: 显示多个查看邮件列表的命令参数用法

  • l | list: 显示当前支持的命令列表

  • more | p | page: 阅读当前指针所在的邮件内容 阅读时,按空格键就是翻页,按回车键就是下移一行

  • t | type | more | p | page {num}: 阅读某一封邮件,多个信息用空格分开,如 & t 1 7

  • d: 删除当前邮件,指针并下移。 & d 1-100 删除第1到100封邮件

  • f | from: 只显示当前邮件的简易信息。 & f {num} 显示某一个邮件的简易信息

  • n | next | {什么都不填}: 阅读当前指针所在的下一封邮件内容阅读时,按空格键就是翻页,按回车键就是下移一行

  • z: 显示刚进行收件箱时的后面二十封邮件列表

  • x: 退出 mail 命令平台,并不保存之前的操作,比如删除邮件

  • q: 退出mail命令平台

写信时,连按两次 Ctrl+C 键则中断工作,不送此信件。读信时,按一次 Ctrl+C,退出阅读状态。

Linux mail 利用外部邮箱地址发邮件

bin/mail 会默认使用本地 sendmail 发送邮件,这样要求本地的机器必须安装和启动 Sendmail 服务,配置非常麻烦,而且会带来不必要的资源占用。而通过修改配置文件可以使用外部 SMTP 服务器,可以达到不使用 sendmail 而用外部的 smtp 服务器发送邮件的目的:

1
2
# 修改/etc/nail.rc (/etc/mail.rc)
set from=fromUser@domain.com smtp=smtp.domain.comset smtp-auth-user=username smtp-auth-password=passwordset smtp-auth=login

说明:

- from: 发送的邮件地址

- smtp: 发送邮件的外部 smtp 服务器的地址

- smtp-auth-user: 外部 smtp 服务器认证的用户名

- smtp-auth-password: 外部 smtp 服务器认证的用户密码

- smtp-auth: SMTP 的认证方式。默认是 LOGIN,也可改为 CRAM-MD5 或 PLAIN 方式

配置成功后,就可以使用了,发送测试邮件

1
mail -s "test" user@sohu.com < content.txt

其中 -s 后面的是邮件标题,user@sohu.com 是收件人地址,content.txt 里面是邮件正文

Centos 新建用户,并配置 root 权限

  1. 添加用户

    adduser tommy,添加一个名为tommy的用户;passwd tommy 修改密码

  2. 赋予 root 权限

    方法1:修改 /etc/sudoers 文件,找到下面一行,把前面的注释(#)去掉

    1
    2
    ## Allows people in group wheel to run all commands
    %wheel ALL=(ALL) ALL

    然后修改用户,使其属于root组(wheel),命令如下:

    1
    $ usermod -g root tommy

    修改完毕,现在可以用 tommy 帐号登录,然后用命令 su -,即可获得root权限进行操作。

    方法2:修改 /etc/sudoers 文件,找到下面一行,在 root 下面添加一行,如下所示:

    1
    2
    3
    ## Allow root to run any commands anywhere
    root ALL=(ALL) ALL
    tommy ALL=(ALL) ALL

    修改完毕,现在可以用 tommy 帐号登录,然后用命令 su -,即可获得root权限进行操作。

Centos 配置用户 root 权限,同时 SSH 免密码登录

  1. 新建用户:adduser tommy,添加一个名为 tommy 的用户

  2. 不允许密码登录 sudo passwd -l tommy

  3. 配置 root 权限

    修改 /etc/sudoers 文件,找到下面一行,把前面的注释(#)去掉

    1
    2
    ## wheel 用户组免密执行所有 shell 命令
    %wheel ALL=(ALL) NOPASSWD: ALL

    然后将用户加入 wheel 用户组(root),usermod -g root tommy

  4. 远程机,修改 sshd 的配置文件(需 root 权限)

    1
    sudo vim /etc/ssh/sshd_config

    开启以下的选项:

    1
    2
    3
    4
    RSAAuthentication yes
    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys
    # PasswordAuthentication no # 此项慎改,如果为 no 将禁止密码方式 SSH 登录

    重启 sshd 服务:

    sudo service sshd restart

  5. 跳板机,生成 SSH 密钥

    ssh-keygen -t rsa -b 4096 -C "your_email@example.com" 一路回车,可生成本机的 rsa 类型的密钥

  6. 远程机把公钥写入 authorized_keys 文件

    跳板机,pbcopy < ~/.ssh/id_rsa.pub 复制公钥;远程机将复制的公钥导入到认证文件 vim ~/.ssh/authorized_keys,粘贴。

  7. 远程机上修改相关访问权限

    1
    2
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys

    如果登录失败,可能是 .ssh 目录的用户及用户组不属于登录的用户,chown 修改即可

查看权限命令

ls -la

权限列表:

输出的第一列描述了文件的权限,以下是对应表:

|:-:|:————————:|
| - | it is a regular file |
| d | if it is a directory |
| c | for a character device |
| b | for a block device |
| l | if it is a symbolic link |
| s | for a socket |
| p | for a pipe |

举个栗子,-rw-r--r--

  • 第1列为文件描述,”-“ 代表[文件];

  • 剩下的每3列为一组,r: 读,w: 写,x: 执行,-: 未设置;

  • 第一组 rw- 对应用户权限;

  • 第二组 r-- 对应组群权限;

  • 第三组 r-- 对应其他用户的权限;

  • 如果相应组为 --- 代表对应的权限没有设置。

1
2
3
4
5
6
7
-rw------- (600) 只有所有者才有读和写的权限
-rw-r--r-- (644) 只有所有者才有读和写的权限,组群和其他人只有读的权限
drwx------ (700) 只有所有者才有读,写,执行的权限
-rwxr-xr-x (755) 只有所有者才有读,写,执行的权限,组群和其他人只有读和执行的权限
-rwx--x--x (711) 只有所有者才有读,写,执行的权限,组群和其他人只有执行的权限
-rw-rw-rw- (666) 每个人都有读写的权限
-rwxrwxrwx (777) 每个人都有读写和执行的权限

读,写,执行权限可以使用数字来代替:

  • r–: 4

  • -w-: 2

  • –x: 1

  • rw-: 4+2= 6

  • r-x: 4+1 =5

  • rwxrw-r–: 764

  • rwx: 4+2+1=7

设置权限:

  • chmod u=rwx,g=rw,o=r A.txt: 设置用户权限 rwx,组权限 rw,其他用户权限 r

  • chmod g+x A.txt: 为组用户增加执行权限

  • chmod u-x A.txt: 为用户移除执行权限

  • chmod a-x filename: 为所有角色移除执行权限

  • chmod 700 file -R: 为用户递归设置 file 文件夹及文件夹下的所有文件读写执行权限

特殊的目录权限:

目录有一个特殊权限 t/T,如果设置了这个权限,此目录的文件只能被拥有此权限的用户删除,即使组和其他用户写目录的写权限,也不能删除文件

------rwt, ------rwT

CentOS 让一个用户没有登录权限

  1. 还未建立用户时,可以使用以下命令

    • useradd -g groupname username -s /bin/false: -s 为默认 shell,不给 shell,也就不能登录

    • useradd -g groupname username -s /sbin/nologin: -s 为默认 shell,默认给予 shell,但是不给登录 shell

  2. 当用户已经建立了,在建立时没有控制,现在需要取消用户登录权限,可以使用以下命令:

    1
    2
    3
    4
    5
    6
    7
    # 切换至 root 用户
    su root
    vim /etc/passwd
    # 找到你要修改的用户所在的那一行
    # eg: username:x:502:502::/home/username:/bin/bash
    # -> username:x:502:502::/home/username:/sbin/nologin

CentOS 查看用户登录记录

1
2
3
4
5
6
7
8
# 查询 wtmp 文件并报告当前登录的每个用户
who
# 查看所有登陆记录
who /var/log/wtmp
# 往回搜索 wtmp 来显示自从文件第一次创建以来登录过的用户
last

rsync 命令

rsync -avz $ENV_PROJECT_ROOT/public/ xjc@180.72.10.136:$ENV_RELEASE_PATH

如果有报错 rsync: failed to set times on "xxx",这是因为同步到目标目录的文件用户和组都变成了同步使用的用户,和远程目标目录的用户和组不一致造成,chown xxx:xxx wwww` 将目标目录的用户和组修改为和执行 rsync 命令的用户一致即可。

scp 命令

scp -Cpr $ENV_PROJECT_ROOT/public/* xjc@180.76.190.127:$ENV_RELEASE_PATH

Linux 下用户,用户组和用户权限的查看

  • more /etc/passwd: 用户信息

  • more /etc/shadow: 用户加密后的口令存放位置

  • more /etc/group: 用户组信息

more /etc/passwd 一行记录对应着一个用户,每行记录又被冒号分隔为7个字段,其格式和具体含义如下:

用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

more /etc/group 每个用户组一条记录,包括用户组、用户组口令、GID及该用户组所包含的用户,格式和具体含义如下:

用户组名称:用户组密码:GID:用户列表

Mac OS 打开原生 NTFS 读写

Mac 本身是支持原生的 NTFS 读写的,只不过这一功能被隐藏了,但是可以手动打开,这比第三方的的工具要安全得多,有时第三方工具可能会发生整个 NTFS 分区数据丢失的情况,下面是打开 MAC 原生 NTFS 读写功能的步骤:

  1. 打开终端输入 diskutil list 查看所有分区的卷标

  2. 输入 sudo vim /etc/fstab 再输入密码回车进入配置

  3. 根据自己要配置的 NTFS 分区卷标输入配置信息,例如:

    1
    LABEL=KINGSTON none ntfs rw,auto,nobrowse
完成后,保存退出
  1. 用磁盘工具将配置好的分区进行卸载再装载使配置生效(无需重启)

  2. 因为加入了 nobrowse 所以 Finder 中看不到修改过的 NTFS 分区(不加入 nobrowse 不会生效),所以可以使用快捷方式进行访问:在终端中输入 sudo ln -s /Volumes/KINGSTON ~/Desktop/KINGSTON 即可在桌面生成 NTFS 分区的快捷方式,或者 cmd+shift+G 前往 /Volumes 文件夹

  3. 将快捷方式拖动到 Finder 的侧边栏就可以很方便的打开 NTFS 分区进行操作了

参考资料: