Linux中一些常见命令的使用实例

遇见即更新,方便查看,熟悉命令

Posted by AspenStars on March 3, 2019

SSH

SSH连接服务器

ssh username@ip
username是服务器上的用户名
ip是服务器ip

可选参数

  • -p 端口号 连接服务器指定端口
  • -i 密钥路径 使用指定路径的密钥连接服务器,避免输入密码(不输入时会默认去~/.ssh/id_rsa寻找密钥,没有或者密钥未授权才会让输入密码)

SSH configrc文件配置

使用SSH的config文件可以免去每次输入usernameip的麻烦,直接使用主机名即可访问

默认是没有ssh的config文件的,输入vim ~/.ssh/config生成并配置

简单的config文件格式为

1
2
3
4
host 你设置的服务器名
    hostname 服务器的ip
    username 用户名
    port 默认为22端口,如果你服务器改了端口,在此设置
示例
1
2
3
4
5
6
7
8
9
Host hello1
  hostname 111.111.11.11
  user world
  port 33

Host hello2
  hostname 222.222.22.2
  user hahaha
  port 5035

经过以上配置,就可以直接使用ssh hello1连接第一个服务器,ssh hello2连接第二个服务器

SSH生成密钥

ssh-keygen -t rsa -C "备注" 使用此命令在~/.ssh/下生成密钥

  • id_rsa是私钥
  • id_rsa_pub是公钥

公钥给服务器或者运维,让他们添加进服务器授权列表,私钥是绝不能泄露的

添加公钥到服务器授权列表

服务器端.ssh目录中新建一个authorized_keys的文件

将公钥内容拷贝到这个文件中,设置权限600

1
2
3
vim authorized_keys //创建authorized_keys文件,打开后将本地的公钥内容复制到这个文件中

chmod  -R 600 authorzied_keys //修改权限,禁止除自己和root外的所有其他用户查看、修改

scp

从本地复制到远程服务器

复制文件

命令格式:

  • scp local_file remote_username@remote_ip:remote_file
  • scp local_file remote_ip:remote_file

第1个指定了用户名,命令执行后需要输入用户密码

第2个没有指定用户名,命令执行后需要输入用户名和密码

remote_file需要输入完整的路径,从/根目录开始

复制目录

命令格式:

  • scp -r local_folder remote_username@remote_ip:remote_folder
  • scp -r local_folder remote_ip:remote_folder

第1个指定了用户名,命令执行后需要输入用户密码;
第2个没有指定用户名,命令执行后需要输入用户名和密码;

从远程服务器复制到本地

从远程复制到本地的scp命令与上面的命令类似,只要将从本地复制到远程的命令后面2个参数互换顺序

如果更换了端口,需要在紧接着scp后面,其他所有参数前面加-P端口号

Git

本地配置

1
2
3
4
git config --global user.name "Your Name"  // 设置用户名
git config --global user.email Your_email@example.com  // 设置用户邮箱,GitHub的小绿点就是根据这个来识别的噢

git config --list // 列出当前git config的设置

常用命令

1
2
3
git add xxx  // 添加文件到暂存区,可以用`.`代替具体的文件名将当前目录及子目录的所有文件都添加进暂存区
git commit -m "xxxxxx"  // 提交修改
git push origin master  // 推送到远程分支,比如Github

du 和 df

du: 显示每个文件和目录的磁盘使用空间

df: 用于显示磁盘分区上的可使用的磁盘空间

du常用参数

  • -s--summariz: 显示总和,不显示子目录大小
  • -h--human-readable: 以人易读的方式显示,比如K、M、G、T等
实例
1
2
3
4
5
6
7
8
9
du // 显示目录或者文件所占空间
du file_name/dir_name  // 显示指定文件或文件夹所占空间
du -s dir_name  // 只显示文件夹总和大小,不显示子文件夹
du -sh dir_name  // 以易读的方式显示文件夹总和大小且不显示子文件夹
du -sh --max-depth=1  // 以易读的方式显示当前目录下所有第一层文件夹的大小
du -sh *  // 同上(可简化代替上一个命令)

df -h  // 以易读的方式显示磁盘分区上的可使用的磁盘空间

mv

用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中

如果将一个文件移到一个已经存在的目标文件中,则目标文件的内容将被覆盖

为什么重命名也用mv命令涉及到一点Linux文件系统的知识,简而言之可以用指针来理解,有空再来展开

1
2
3
mv file_name1 file_name2  //文件重命名
mv dir1 dir2  // 目录重命名
mv file_name dir  // 将文件移动到dir目录下

vi

跳到文件第一行

  • 输入:0或:1,然后回车
  • 在键盘按下小写gg

跳到文件最后一行

  • 输入:$,然后回车
  • 在键盘按下大写G
  • 在键盘按Shift + g

翻页

  • Ctrl + B 向上翻页(此处不分大小写)(单词backward的意思)
  • Ctrl + F 向下翻页(forward)

wc 统计文件数量

  • ls -l|grep "^-"|wc -l
    • ls -l 详细输出该目录下文件信息,也可以使用ls -lR连子目录下的文件一起统计
    • grep ^- 将输出信息过滤,只保留一般文件,保留目录用 ^d

    • wc -l 统计输出信息的行数,因为已经过滤得只剩一般文件了,所以统计结果就是一般文件信息的行数,又由于一行信息对应一个文件,所以也就是文件的个数。
  • find ./ -type f|wc -l
    • 默认find会去子目录查找,用find ./ -maxdepth 1 -type f只查找当前目录的文件

第二种方法会比第一种方法快很多,尤其是统计子目录时

tar 打包和压缩

打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件

Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)

1
2
3
4
5
6
7
- z:有gzip属性的
- j:有bz2属性的
- Z:有compress属性的
- v:显示所有过程
- O:将文件解开到标准输出
- r:添加文件到已经压缩的文件
- f:<文件>或--file=<文件>:指定打包后的文件名

切记:参数-f是必须的,且是最后一个参数,后面只能接打包后的文件名

实例

压 缩:(不带z或者j时代表只打包不压缩)

1
2
tar -zcvf filename.tar.gz <要被压缩的文件或目录名称>
tar -jcvf filename.tar.bz2 <要被压缩的文件或目录名称>

查 询:

1
tar -ztvf filename.tar.gz

解压缩:

1
2
tar -zxvf filename.tar.gz -C <欲解压缩的目录>
tar -jxvf filename.tar.bz2 -C <欲解压缩的目录>

conda

创建环境:conda create -n 环境名称

删除环境:conda remove -n 环境名称 --all

重命名:通过clone实现

  • 先 clone 一份 new name 的环境
  • 删除 old name 的环境

conda create -n 新名称 --clone 旧名称
conda remove -n 旧名称 --all

显示当前虚拟环境信息 conda info -e

ln 文件链接

linux下文件链接有硬链接软连接两种形式,都是为了节省磁盘空间
区别两种形式前要明白Linux文件系统下其实是由文件节点(inode)来唯一确定文件的,文件名只是指向文件节点的一个形式

  • 硬链接:对真实inode进行修改
    • 解释:增加一个指向文件节点的真实链接,对任意一个硬链接的修改,实际是对文件系统inode节点的文件进行修改,所以每个硬链接文件都会有同样的修改
    • 意义:在不增加磁盘空间的情况下,保存多个相同且可以自动同步的文件(在不同路径下使用、修改并保证同步同一个文件)
  • 软连接:不对真实inode进行修改
    • 解释:等效于windows下的快捷方式,对快捷方式的修改没有任何意义
    • 意义:可以在多个地方使用同一个文件,一般不对这个文件进行修改
  • 区别:软连接和硬链接其实很相似,只是使用的地方不同
    • 软连接一般用在只读的地方,硬链接用在对文件修改得较多的地方
    • 建立一个硬链接会增加该文件inode的连接数(修改inode的地方),而软连接不会修改这个

语法

1
ln [选项] 源文件 目标文件

参数

  • 源文件:指定连接的源文件。如果使用-s选项创建符号连接,则“源文件”可以是文件或者目录。创建硬连接时,则“源文件”参数只能是文件
  • 目标文件:指定源文件的目标连接文件

示例

将目录/home/hello/word下的文件HELLO1链接到目录/usr/bin下的文件HELLO

1
2
cd /home/hello
ln word/HELLO1 /usr/bin/HELLO

在执行ln命令之前,目录/usr/bin中不存在HELLO文件。执行ln之后,在/usr/bin目录中才有HELLO这一项,表明HELLO1HELLO链接起来(注意,二者在物理上是同一文件),利用ls -l命令可以看到链接数的变化。

在目录/usr/bin下建立一个符号链接文件abc,使它指向目录/home/hello/word

1
ln -s /home/hello/word /usr/bin/abc

执行该命令后,/home/hello/word代表的路径将存放在名为/usr/bin/abc的文件中

返回上一次目录

cd - 该命令等同于cd $OLDPWD,关于这一点在bash的手册页(可使用命令man bash访问其手册页)中有介绍: An argument of - is equivalent to $OLDPWD.

神奇的感叹号

!!:上一条命令

!$:上一条命令中的最后一个参数

!:-:上一命令除了最后一个参数

!:数字:上一命令的第几个参数(不算命令,从参数开始数)

!*:上一条命令中的所有参数

!str:最近一条以str开头的命令

!?str?:最近一条包含str的命令

!n:顺数第n条命令

!-n:倒数第n条命令

^old^new:将上一命令中的old替换为new

!!:gs/old/new:将上一命令中的old替换为new

!scp:gs/old/new:将上一scp命令中的old替换为new

Bash 快捷键

本小节转载自Linuxtoy.org

编辑命令

  • Ctrl + a :移到命令行首
  • Ctrl + e :移到命令行尾
  • Alt + f :按单词前移(右向)
  • Alt + b :按单词后移(左向)
  • Ctrl + xx:在命令行首和光标之间移动
  • Ctrl + u :从光标处删除至命令行首
  • Ctrl + k :从光标处删除至命令行尾
  • Ctrl + w :从光标处删除至字首
  • Alt + d :从光标处删除至字尾
  • Ctrl + d :删除光标处的字符
  • Ctrl + h :删除光标前的字符
  • Ctrl + y :粘贴至光标后
  • Alt + c :从光标处更改为首字母大写的单词
  • Alt + u :从光标处更改为全部大写的单词
  • Alt + l :从光标处更改为全部小写的单词
  • Ctrl + t :交换光标处和之前的字符
  • Alt + t :交换光标处和之前的单词
  • Alt + Backspace:与 Ctrl + w 相同类似,分隔符有些差别 [感谢 rezilla 指正]

重新执行命令

  • Ctrl + r:逆向搜索命令历史
  • Ctrl + g:从历史搜索模式退出
  • Ctrl + p:历史中的上一条命令
  • Ctrl + n:历史中的下一条命令
  • Alt + .:使用上一条命令的最后一个参数

控制命令

  • Ctrl + l:清屏
  • Ctrl + o:执行当前命令,并选择上一条命令
  • Ctrl + s:阻止屏幕输出
  • Ctrl + q:允许屏幕输出
  • Ctrl + c:终止命令
  • Ctrl + z:挂起命令

Bang (!) 命令

  • !!:执行上一条命令
  • !blah:执行最近的以 blah 开头的命令,如 !ls
  • !blah:p:仅打印输出,而不执行
  • !$:上一条命令的最后一个参数,与 Alt + . 相同
  • !$:p:打印输出 !$ 的内容
  • !*:上一条命令的所有参数
  • !*:p:打印输出 !* 的内容
  • ^blah:删除上一条命令中的 blah
  • ^blah^foo:将上一条命令中的 blah 替换为 foo
  • ^blah^foo^:将上一条命令中所有的 blah 都替换为 foo

_友情提示_:

  1. 以上介绍的大多数 Bash 快捷键仅当在 emacs 编辑模式时有效,若你将 Bash 配置为 vi 编辑模式,那将遵循 vi 的按键绑定。Bash 默认为 emacs 编辑模式。如果你的 Bash 不在 emacs 编辑模式,可通过 set -o emacs 设置。

  2. ^S、^Q、^C、^Z 是由终端设备处理的,可用 stty 命令设置。