0%

Linux命令行工具

Please keep learning —> Linux工具快速教程

测试网络连接

linux 上一般是不装ping的

1
2
3
4
telnet 8.8.8.8 80
curl 8.8.8.8:80
ssh -v -p qqs@8.8.8.8
wget 8.8.8.8:80

拷贝目录

将工作空间目录下的test文件夹拷到labhome下面

1
cp -ri /home/Workspace/test /var/labhome/
  • -r 递归
  • -i 询问是否覆盖

查找文件

find [path] -name [filename]

1
find / -name filename

tail

1
tail -f filename

tail命令读取文件内容到标准输出,-f 循环读取,上述命令查找文件中最尾部的内容显示在屏幕上,并且不断刷新,使你看到最新的文件内容

filename 可以是多个文件 以空格分隔即可

tar

tar 通常是GNU tar,而libarchive库集成了bsdtar,不知道为什么我的windows默认的tar.exe是后者执行下述脚本

1
tar -c * | gzip > Agt.tgz

报异常:tar.exe: Failed to open ‘\.\tape0’
该路径是缺省的设备起始位置(?),因为bsdtar要求不能缺省输出参数 应为

1
tar -cf - * | gzip > Agt.tgz

后台运行

后台运行命令

1
anycommand $

将前台命令放到挂起(stopped)

Ctrl + Z
查看后台工作项目

1
jobs -l

操作后台工作项目

  • 终止后台工作项目 kill jobNumber
  • 调至前台继续运行 fg jobNumber
  • 在后台执行挂起的工作项目 bg jobNumber

vi查找

在命令模式下敲斜杆( / )这时在状态栏(也就是屏幕左下脚)就出现了 “/” 然后输入你要查找的关键字敲回车就可以了。
如果你要继续查找此关键字,敲字符 n 就可以继续查找了。
敲字符N(大写N)就会向前查询;

重命名rename

个人理解: 语法其一 rename 原字符串 新值 范围

将run.sh重命名为run_bak.sh

1
rename run.sh run_bak.sh run.sh

语法其二 rename ‘option/原字符串模式/新字符串模式/‘ 搜索范围

统一删除.bak后缀名:

1
rename 's/\.bak$//' *.bak

其中/ /之间是正则表达式,后缀名中的.需要转义

批量修改文件名为全部小写

1
rename 'y/A-Z/a-z/' *

软件

1
2
3
sudo npm cache clean -f #----- 先清除 npm cache
sudo apt-get update #------ 更新源
sudo apt-get upgrade #------ 更新已安装的包

对于nodejs npm需要使用n模块升级到最新稳定版本

1
2
3
sudo apt-get install nodejs npm
npm install -g n
sudo n stable

Nov 25th 遭遇 issue 27711 需将nodejs从v12降至v10

1
sudo n 10.16.0

RPM

1
2
3
4
wget https://example.com/file.rpm
sudo yum localinstall file.rpm
sudo rpm –ivh file.rpm
sudo rpm –ivh https://example.com/file.rpm

查看系统版本

1
2
3
cat /etc/issue 查看发行版
cat /etc/redhat-release 查看CentOS版本
uname -r 查看内核版本

查看硬件信息

1
2
3
4
5
cat /proc/cpuinfo |more
cat /proc/meminfo |more
// 磁盘
cat /proc/partitions
fdisk -l

查看服务列表

1
service --status-all

异常:键入命令不显示(回显关闭)

1
2
3
4
// 回显关闭
stty -echo
// 回显打开
stty echo

定时任务

查看服务状态

1
service cron status

crontab

1
2
3
4
// 列出该用户的计时器设置
crontab -l
// 编辑该用户的计时器设置
crontab -u username -e

不指定username 则以root用户身份执行

计划任务分为系统任务调度用户任务调度两类

系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等 见/etc/crontab时日周月计划。

用户任务调度:用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在/var/spool/cron目录中。其文件名与用户名一致

实际上,crontab文件被设计为不允许(存疑)用户直接编辑,而是通过crontab -e管理
计划的格式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
  • * 表示匹配该域的任意值。假如在Minutes域使用*, 即表示每分钟都会触发事件。
  • / 表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.
  • - 表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
  • , 表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。

  • ? 只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 ?, 其中最后一位只能用?,而不能使用,如果使用*表示不管星期几都会触发,实际上并不是这样。

  • L 表示最后,只能出现在DayofWeek和DayofMonth域。如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。

  • W 表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。

  • LW 这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。

  • # 用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。

例子:

20 6 pwd 每天的 6:20 执行pwd命令

20 6 8 6
pwd 每年的6月8日6:20执行pwd命令

20 6
0 pwd 每星期日的6:20执行pwd命令

20 3 10,20 pwd 每月10号及20号的3:20执行pwd命令

25 8-10
pwd 每天8-10点的第25分钟执行pwd命令
/15 pwd 每15分钟执行一次pwd命令

20 6 /10 * pwd 每个月中,每隔10天6:20执行一次pwd命令

开启系统cron日志

sudo vim /etc/rsyslog.d/50-default.conf 取消注释

1
cron.log

即可在/var/log/syslog中看到关于CRON的log

ISSUE: No MTA installed, discarding output

cron默认将console output用邮件发送,task有控制台输出但未配置邮件则记如上日志,可以将console output重定向到文件

1
echo "" > /home/QQs/corn.log

若task执行中间过程有报错,报错信息仍会以Email形式发送,非安装邮件服务器不能解决
安装postfix

注意,crontab task 若以root权限执行(syslog中可以看到),root若无重定向日志文件的写权限,仍然会报 “No MTA installed, discarding output”

重载CRON服务

1
sudo service cron reload

启动/关闭

1
sudo service cron start/stop

Ubuntu timezone

显示时间:

1
date -R

某年月日,测试scheduled tasks,总是无法在期望时间触发,经查系统时间为‘Universal Time’(即格林威治时间时间)
输入

1
tzselect 

选择本地时间(shanghai)

永久覆盖本地时间设置

1
cp /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime

设置时间

1
date -s '2020/3/1 18:20:30'

Linux 以一定时间间隔更新内核时间,做上述调整后立即重启,可以将设置写入内核,否则会被更新回来(QQs尚未验证重启操作)

异常:刚启动正常,很短时间后,所有端口无法连接

事实证明,Linux与Windows发生IP冲突,Linux无法竞争过Windows,(反之未验证),现象是刚刚启动时连接正常,很短时间后无法连接。
再次遭遇此问题,Linux虚拟机IP被抢,virtualbox桥接,宿主计算机访问虚拟机无碍,其他计算机可以ping通,telnet不通(目标ip实际上是windows机器)

user

1
su -l USERNAME

chmod

Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。

例如 owner - RWX, group - RX, other - R_

如上,u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。

1
chmod [ugoa...][[+-=][rwxX]

栗子

1
2
chmod ugo+r file1.txt //将文件 file1.txt 设为所有人皆可读
chmod a+r file1.txt // 同上

其他参数

  • -R 对目录递归变更权限

查看端口使用

1
sudo lsof -i:8080

curl

即client url tool curl 的用法指南

dos2unix

windows&linux交叉编译环境下脚本结尾标记可能出错

Bash syntax error: unexpected end of file

使用dos2unix工具转换脚本文件

1
dos2unix task.sh

avahi-daemon

网络零配置工具 设备使用动态ip地址 使用hostname访问设备

1
2
sudo apt install avahi-daemon
sudo systemctl restart avahi-daemon

配置文件/etc/avahi/avahi-daemon.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[server]
# host-name 也就是你 Windows 上访问时的名字
# 注意:不要加 .local 后缀,这里只要纯名字
host-name=orangepi

# 使用ipv4
use-ipv4=yes
use-ipv6=no

# 使用wlan0网卡工作
allow-interfaces=wlan0
deny-interfaces=eth0

# 网段转发
[reflector]
enable-reflector=yes
reflect-ipv=no

# 资源上限
[rlimits]
rlimit-nofile=30

在局域网内使用ping orangepi.local即可