Since Jan.26th,2016
1、关于目录
-
~
表示/home/rancho
,打开terminal后默认就是在这个目录下。 -
./
并非执行文件的前缀,而是代表当前目录。
(比如在~
下,cd /桌面
是不行的,cd ./桌面
是可行;又比如./home/rancho/桌面/test
是不行,./桌面/test
是可行的)
http://blog.sina.com.cn/s/blog_7cfc0d130101bvi3.html - 遇到目录名中有空格的时候,可以用
"…"
,即在路径外加双引号。 - 遇到目录中(文件名)出现括号
(``)
的,可能会报错bash: 未预期的符号 \
(' 附近有语法错误`,可以在文件名外加引号以防报错。
2、执行文件
- 只要文件内容是linux支持的命令的文本,无论后缀名如何(比如【.mp3】),只要获得执行属性,都可以被执行。
执行时只要在任意目录下输入全路径即可,如在~
下/home/rancho/桌面/tt
,或者./桌面/tt
。 - 在没有获得执行属性的情况下,也可以通过
sh
命令执行。比如sh ./桌面/test
3、nautilus,shutdown,reboot
-
nautilus
,sudo nautilus
,nautilus ./文档
sudo shutdown -h now
,sudo shutdown -r now
,sudo reboot
4、ln
- 比如为【shared】在桌面创建【ForSharing】(软链接,不占用磁盘空间),在
~
下代码即为ln -s /mnt/shared ./桌面/ForSharing
5、more
-
more
用来查看文件里的内容,并以一页一页的方式来现实,space键下一页,b键(back)上一页。
more ./桌面/test.py
6、df
-
df -hl
查看磁盘剩余空间,如果不加h
(不考虑l
),变成单独的df
则单位显示会变成统一的KB。
7、(VPS)ls和dir
- 注意和
ln
的区分,ln
是用来创建链接,ls
是用来查看某个文件夹下面的所有文件。
rancho@rancho-VirtualBox:~$ ls ./桌面
ForSharing learning.py test.py 汉诺塔.py~
hanol~ shoplist.data 挂载ForSharing 未解之谜(删除空白符).py
helloworld.py shoplist.data~ 挂载ForSharing~ 未解之谜(杨辉三角).py
helloworld.py~ temp for test.py 汉诺塔.py 无标题文档~
-
dir
命令也可以起到相似的效果,但是dir
不会区分文件夹和文件。 -
dir
和ls
末尾加-l
(小写的L)表示列出详细属性,包括大小、权限,修改日期等,这一点在查看链接文件时非常好用,因为它会显示出链接文件的指向地址。同时,-h
参数能够以合适的单位而不全是字节来显示文件大小,所以一般两者一起使用:
ls -lh
-
-a
参数能够列出所有文件,包括隐藏文件,因此,在 ssh 到一个新服务器时很有用。 -
-R
(注意大写)表示列出所有子目录层。
8、find 命令
-
find /home/rancho/桌面 -name filename
即为在某一个路径(/home/rancho/桌面)下搜索文件名为filename
的文件
find /home/rancho/桌面 -name "test.py"
输出
/home/rancho/桌面/test.py
若为-iname
,即忽视大小写影响
注意的是可以用*来泛指,比如查找文件名中含有test的文件,但切记需要对文件名加引号,不然可能引起错误(具体可能引发的错误没有仔细查阅,但加上引号应当是没有问题了的)。
find /home/rancho/桌面 -name "*test*"
输出
/home/rancho/桌面/test.py
/home/rancho/桌面/temp_test.py
/home/rancho/桌面/__pycache__/temp_test.cpython-34.pyc
9、重复命令
- 有4种方法可以重复执行上一条命令:
使用上方向键,并回车执行。
按!!
并回车执行。
输入!-1
并回车执行。
按 Ctrl+P 并回车执行。
http://linuxtoy.org/archives/history-command-usage-examples.html
10、软件卸载命令
- 第零步,如果不清楚软件的具体名字,则需要搜索包(软件假设为 test)
用 apt 软件包管理工具 apt-cache 搜索包的名字
apt-cache search test
如果显示信息太多难以看清,可以用管道提取一下
apt-cache search test|grep test
- 第一步,卸载软件(两种选择)
- 彻底卸载(并删除相关配置文件)
sudo apt-get --purge remove test
- 卸载软件(但保留配置文件)
sudo apt-get remove test
- 第二步,删除残留文件
- 删除依赖于 test 的包
sudo apt-get autoremove
- 删除 test 的安装包
sudo apt-get autoclean
注:sudo apt-get clean
是删除软件(包括已安装和已卸载)的安装包,也可以使用这条命令,对硬盘空间释放得更彻底。
- 第三步,清除已删除包的残余配置文件
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
11、/bin/sh 和 /bin/bash
- 可以把 sh 看成 bash 在 posix 标准下的一个实现,因此
/bin/sh
和
/bin/bash --posix
可以看成效果相同。
-
/bin/sh -c
后加上命令可以直接执行,而如果执行的是一个文件则不用加-c
的参数。
/bin/sh -c google-chrome
/bin/sh test.sh
12、后台运行命令
- 终端输入程序后台运行的命令后可以同时干其他事。
只要在最后加&
即可
test &
13、查看 USB 设备
可以查看硬件 ID
lsusb
14、swap 分区和内存的平衡
- 设置何时启用swap分区
sudo sysctl vm.swappiness=10
这是暂时设置(重启失效)当内存占用达到90%时开始启用 swap,默认情况下,
vm.swappiness=60
如果想要永久改变这个值,需要更改/etc/sysctl.conf
,在最后加上一行,
vm.swappiness=10
- 释放刷新swap
sudo swapoff -a; sudo swapon -a
会看到 swap 分区中的内容逐渐减少,到零后 off,然后再重新 on。
15、(VPS)用户的添加、删除、切换等
- 添加用户
sudo adduser username
接下来会显示一堆信息,然后输入密码,重复确认即可。这一条命令同时会在 home 分区下创建对应的用户文件夹。
- 加入组
一般情况下我们会需要把用户加入 sudo 组,不然会无法使用 sudo 命令。加入 sudo 组使用下面这条usermod
命令:
sudo usermod -a -G sudo username
usermod
的参数a
是 append 的意思,和G
(group)一起使用。
完成后我们查看一下 username 所在的组,看是否已经加入了 sudo 组。查看组使用groups
命令:
groups username
- 切换用户
如果需要切换用户的话,可以使用su
(switch user)命令:
su username
如果不加 username,直接su
的话表示切换到 root 用户。但要注意的是使用su
切换到 root 用户后,环境变量并没有切换过去。而是用su -
切换到 root 用户后,则将环境变量也切换过去了。
如果需要临时切换成其他用户执行某条命令,可以使用-c
参数:
su username -c "test"
这里还可以使用sudo -s
临时切换到root
用户,表面区别在于su
需要输入的是 root 的密码,而sudo -s
需要输入的是当前用户的密码,当需要临时以 root 用户执行多条命令,但又不想输入 root 密码,也不想每次都用su -c "command"
的冗长形式,可以使用sudo -s
临时切换成 root。
当然,sudo -s
的解释是:
执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell
(然而这一点我并不能理解)
- 删除用户
而如果需要删除用户,可以在其他用户下使用sudo userdel username
命令。 - 查看用户登陆情况
last
不加参数显示所有的用户成功登陆的情况,若要显示最近几条登陆信息,则使用-n
参数,比如:
last -n 3
显示最近的三次成功登陆情况。
lastb
则是用来查看登录系统失败的情况,包括 ssh 在内,是一个防范安全的好措施。不过和last
不同的是,lastb
查看的是/var/log/btmp
文件,因此需要 root 权限,所以一般使用sudo lastb
。
w
查看当前系统用户登陆情况
16、(VPS)ssh 配置
- 禁止 root 远程登陆
更改/etc/ssh/sshd_config
文件中的PermitRootLogin yes
为PermitRootLogin no
,然后重启 ssh,重启命令为:
service ssh restart
- 查看 ssh 登陆日志(包括成功与失败)
在 Ubuntu 系统下,可以查看/var/log/auth.log
文件,而在 CentOs 下可以下查看/var/log/secure
,这个直接进入/var/log
目录下看看存在的是哪个文件即可。具体日志文件的分配是写在/etc
下的一个配置文件中,不同版本的系统不同,在 Ubuntu 14.04 x86 服务器版本中,通过查看/etc/syslog.conf
得知默认日志设置可以需要查看/etc/rsyslog.d/50-default.conf
文件。文件中日志内容的解读可以参照https://www.howtoing.com/how-to-view-and-configure-linux-logs-on-ubuntu-and-centos/
但不知道为什么,目前我的系统中auth.log
始终是空的,不记录任何登录情况,我查找了很多资料,确认权限正确,配置应该也是指向这个文件的,不知道问题出在哪里,目前没有解决。
这时如果要查看登录失败的用户可以通过lastb
命令,而查看登陆成功的则通过last
命令。 - 如果要用到远程端口转发的话,在配置文件最后加上一行
GatewayPorts yes
不然的话以后远程端口转发时监听的远程端口是127.0.0.1:port,而不是0.0.0.0:port
- 使用远程端口转发的时候,使用 127.0.0.1 指代本地机器,因为 localhost 指代的是远程主机,例如:
ssh -R 80:127.0.0.1:8000
而不要用
ssh -R 80:localhost:8000
+使用端口转发时,有时长时间没有键盘动作会使中断连接,显示
packet_write_wait: Connection to XXX : Broken pipe
解决办法是在发起 ssh 的客户端(不是 server 端)配置文件中进行修改,使得每隔一段时间发送一个信号保持连接。
vi ~/.ssh/config
Host *
ServerAliveInterval 30
ServerAliveCountMax 5
- X forwading(X 转发)
首先需要在 server 进行配置(有可能默认就是打开)
sudo vim /etc/ssh/sshd_config
X11Forwarding yes
X11DisplayOffset 10
然后在 client 进行 ssh 连接转发 X:ssh -X test@test
尝试打开 xclock:xclock
如果报错Error: cannot open display: XXXXX
,则输入echo $DISPLAY
确认一下屏幕和端口是否正确,比如是否是localhost:10.0
,这里如果有问题可能需要更改 server 端配置文件中的X11UseLocalhost
选项,不过一般不会有问题。具体屏幕和端口的含义可以参考https://blog.finaltheory.me/note/X11-Forwarding-GUI.html
如果报错Segmentation fault (core dumped)
,可以参考https://askubuntu.com/questions/795418/open-gui-apps-on-a-ubuntu-16-04-machine-via-ssh-from-an-ubuntu-14-04-machine中的解决方案。第一种解决方案测试通过,即在 /usr/lib/x86_64-linux-gnu 下增加一个软链接到 /usr/lib/nvidia-361/libGLX_indirect.so.0:sudo ln -s /usr/lib/nvidia-384/libGLX_indirect.so.0 /usr/lib/x86_64-linux-gnu/libGLX_indirect.so.0
,具体路径根据不同的 Nvidia 版本而不同。
17、(VPS)系统时区调整
使用命令行交互界面修改
sudo dpkg-reconfigure tzdata
更多详情参考http://www.kaifazhe.me/server/110.html
18、(VPS)中文语言环境变量
在终端下显示中文有问题,可能是语言环境变量中没有安装中文,可以用locale-gen
命令:
locale-gen zh_CN.UTF-8
19、(VPS)shell 脚本调试
#!/bin/sh -x
x
参数意味着 xtrace,接下来会把整个脚本执行过程都打印出来。
20、(VPS)开机启动
- rc.local
一般在/etc/rc.local
中写入命令即可,只需要注意写在exit 0
前。
但开机执行这个脚本由init
来掌控的,理论上是有足够高的权限的,但可能仍然会出现问题,这是可以考虑临时切换用户执行命令,比如su root -c "test"
。
事实上,开机启动不执行写在rc.local
文件中的命令由很多可能,需要耐心调试,比如先确定当前系统等级,然后找到对应的开机启动脚本,确认启动脚本中是否调用了/etc/rc.local
脚本,或者是由于sh
调用的是dash
而不是bash
,产生兼容性问题等。当然事实上,以上发生的可能性并不高,更有可能的时本身写的脚本或者命令有问题,比如语法或者权限问题。- 调试方法
在 rc.local 最后加入
- 调试方法
exec 2> /tmp/rc.local.log
exec 1>&2
set -x
touch /var/lock/subsys/local
XXXXXXXXXXX
exit 0
即把日志输出到 /tmp/rc.local.log(可以修改)。
- ~./config/autostart
因为 rc.local 的执行是在登陆之前,因此有些联网操作或者依赖图形界面的操作可能就无法执行,因此我们在 ~/.config 目录下新建一个 autostart 目录,然后新建一个文件 test.desktop,输入以下内容:
[Desktop Entry]
Type = Application
Exec = 程序启动脚本的路径
- 后台执行
如果程序需要长时间运行,或者由大量的输出内容,尽可能放在后台执行,不然可能会堵塞开机的某些进程,或者会直接报错,将这一条开机自启程序略过。后台执行自然就是直接在命令最后加&
即可。
21、网络相关
- 临时禁用网卡(eno1为示例)
sudo ifconfig eno1 down
- 临时启用网卡(eno1为示例)
sudo ifconfig eno1 up
- 重启网络服务
sudo /etc/init.d/networking restart
- 查看路由
route
- 设置网关
route add default gw 192.168.1.1
22、桌面相关
- 重置 compiz
dconf reset -f /org/compiz/
- 重启 unity
setsid unity
22、UEFI 启动
- 若选择 UEFI 启动且进行手动分区,则在手动分区时应当单独分出一个 EFI 分区,启动器安装位置选择 EFI 分区所在的整块硬盘。
23、tar
-
-f
后要立刻加输出的文件名 - 打包但不压缩
tar -cvf out.tar filename1 filename2
- 打包且压缩
tar -cvzf out.tar.gz fillename1 filename2
- 解包且查看每个文件名字(
-v
)
tar -xvf file.tar
- 解压缩且查看每个文件名字(
-v
)
tar -xzvf file.tar.gz
24、scp
25、wget
- wget 下载文件夹要求网址的最后是/,比如 http://192.168.66.66/test/,而不能是 http://192.168.66.66/test
- wget 删除 index.html:
-R "index.html*"
,注意不要漏掉末尾的* - 下载文件夹一般可以用以下命令即可
wget -r -nH -R "index.html*" http://192.168.66.66/test/
其中-r
表示递归下载,-nH
表示不建立主机目录,-R
表示不下载的文件类型
26、rsync
- 本地拷贝
rsync -av source/ destination/
- ssh 拷贝
rsync -av -e ssh source/ destination/
- 增量同步
rsync -avu source/ destination/
其他相关参数说明参考 http://www.cszhi.com/20120312/rsync-simple.html
- 删除多余文件
增加--delete
参数 - 排除特定文件
rsync --exclude="/test/.jpg"
- 排除一类文件
rsync --exclude="*.jpg"
- 多个排除规则
rsync --exclude-from="exclude-list.txt"
在 exclude-list.txt 中用换行符分隔开不同规则
- 路径大坑说明
- 一般情况下文件夹都需要在末尾加
/
表示,不然可能会被认为是文件 - 对于 source 文件夹,如果末尾不加
/
的话,就会得到 destination/source/... 的文件结构,也就是将 source 本身复制到了 destination 下。而如果加了/
,则会得到 destination/... 的文件结构,也就是讲 source 文件夹内的所有东西复制到了 destination 下。 - 对于 exclude 中的路径,
/
指代的是相对根目录,而不是 root 目录。比如rsync -av exclude="/foo.jpg" source/ destination/
排除的实际上是 source/foo.jpg。
关于这一点,详情参见https://unix.stackexchange.com/questions/83394/rsync-exclude-directory-not-working
- 一般情况下文件夹都需要在末尾加
27、rename
- rename 命令有两个版本,可用
man rename
来查看是 C 语言版还是 Perl 版本的。
Perl语言版本格式:rename 's/原字符串/新字符串/' 文件名
example:仍然是刚刚那两个文件:a_01、a_02,若需要将文件名中的a替换为b,其他部分保持不变则应当键入rename 's/a/b/' a_*
参考自https://www.jianshu.com/p/ac6f695565ab
- find 和 rename 共同使用来递归搜索大量文件进行重命名
比如要将所有当前目录下(包括嵌套文件夹内部)所有 train_predicition.csv 重命名为 train_prediction.csv,可以使用以下命令。
find . -name "train_predicition.csv" -exec rename 's/predicition/prediction/' '{}' \;
其中,exec 是 find 的一个参数项,关于'{}'
和\
的意义可以参考http://www.developerq.com/article/1498736274
28、reset
清空终端
29、xargs
- -i
用 {}就能代替管道之前的标准输出的内容
30、查看文件夹大小
du -h --max-depth=1
31、查看文件 MD5、SHA-1、SHA-256、SHA-512 值
python -c "import hashlib,sys;print hashlib.md5(open(sys.argv[1],'rb').read()).hexdigest()" FILE_NAME
python -c "import hashlib,sys;print hashlib.sha1(open(sys.argv[1],'rb').read()).hexdigest()" FILE_NAME
python -c "import hashlib,sys;print hashlib.sha256(open(sys.argv[1],'rb').read()).hexdigest()" FILE_NAME
python -c "import hashlib,sys;print hashlib.sha512(open(sys.argv[1],'rb').read()).hexdigest()" FILE_NAME