Linux (Ubuntu)

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

  • nautilussudo nautilusnautilus ./文档
    sudo shutdown -h nowsudo shutdown -r nowsudo 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不会区分文件夹和文件。
  • dirls末尾加-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
  • 第二步,删除残留文件
    1. 删除依赖于 test 的包
sudo apt-get autoremove
  1. 删除 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查看当前系统用户登陆情况

Linux (Ubuntu)_第1张图片
http://goodbai.com/secure/WhoMovedYourLinuxOS.html

16、(VPS)ssh 配置

  • 禁止 root 远程登陆
    更改/etc/ssh/sshd_config文件中的PermitRootLogin yesPermitRootLogin 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

Linux (Ubuntu)_第2张图片
http://dola.xinfan.org/?p=517.png

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 版本的。
    Linux (Ubuntu)_第3张图片
    https://www.jianshu.com/p/ac6f695565ab

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

你可能感兴趣的:(Linux (Ubuntu))