Linux-Shell

1、xshell安装和连接

SSH(远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求,包括公共秘钥等交换等信息。

ssh服务端由2部分组成:openssh(提供ssh服务)openssl(提供加密的程序)

ssh的客户端可以用XSHELL,Securecrt,Mobaxterm等工具进行连接

————————————————

虚拟机可以直接输入shell命令;
安装xshell:模拟远程连接虚拟机,跟finalshell一样,功能更多,xshell是收费的,先安装一个学习版免费
xshell用ssh连接虚拟机,ip:10.0.0.200, 端口22  # 虚拟机有一个程序在监听着22端口,这是默认的
-->输入服务器(虚拟机)账户、密码   # 可以用非对称加密,本地生成公钥私钥,把公钥放到服务器家路径下的.ssh文件夹下,以后本地登录就不需要输入密码

# 重启网卡命令
systemctl restart network

# cmd命令,查看本机局域网网关,很多局域网又归于一个总出口,百度搜“我的ip”
ipconfig

 

2、什么是Bash shell(壳)

Bash Shell是一个命令解释器,它在操作系统的最外层,负责用户程序与内核进行交互操作的一种接口,将用户输入的命令翻译给操作系统,并将处理后的结果输出至屏幕。

通过xshell连接,就是打开了一个bash程序的窗口,不能点鼠标,只能输入命令

当我们使用远程连接工具连接linux服务,系统则会给打开一个默认的shell,我们可在这个界面执行命令、比如:获取系统当前时间,创建一个用户等等…

输入bash--->开一个bash窗口,输入exit--->退出bash窗口

3、Bash Shell能干什么?

使用Shell实现对Linux系统的大部分管理,例如:
1.文件管理(文件创建,移动,复制,删除,编辑…)
2.权限管理(不同用户不同权限)
3.用户管理(创建,删除….)
4.磁盘管理(挂载)
5.网络管理
6.软件管理
.等等.

 

4、平时我们如何使用Shell呢?

输入命令 –> 效率低 –>适合少量的工作
Shell Script –> shell脚本 ,写到一个.sh文件里,批量执行命令,效率高–>适合复杂重复性的工作
例如:创建100个用户,单纯输入命令需要执行100次,而Shell脚本只需要几行命令即可完成100个用户的创建

vim test.sh--->打开test.sh文件--->进入vim,点击I输入以下代码-->:wq保存退出 

# for循环100次,造100个用户,并打印用户名
for i in {1..100}
do
 useradd test$i
 echo "create test$i"
done
bash test.sh # 执行这个文件夹命令 

# 了解即可,python脚本也能执行,Linux系统自带python2.7环境

 

5、Shell提示符

例如:[root@lqz ~]#   超级用户
      [lqz@lqz ~]$    普通用户

1、root:当前登录用户
2、@ :没有意义
3、lqz:主机名称,如果很长会显示不全,通过hostname查看
4、 ~:当前用户所在家目录
5、#:通常指超级管理员
6、$:普通用户 


[root@web01 ~]# useradd jack       创建用户名为jack的用户
[root@web01 ~]# passwd jack        创建jack的密码
Changing password for user jack.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.
[root@web01 ~]# su jack
[root@web01 ~]# cd root   提示没有权限

 

6、Shell基础语法

命令行bash shell, 为用户提供输入, 执行命令的界面

# 命令     选项       参数
command [-options] [arguments]

[root@lqz ~]# ls             #命令
[root@lqz ~]# ls -a          #命令+选项
[root@lqz ~]# ls -a /home/   #命令+选项+参数(ls查看当前路径下的文件夹和文件;-a表示查看所有,包含隐藏文件;/home表示查看的文件夹)

# 以下三个一样,可以配两个选项: -l是显示文件夹/文件详情, -a查所有
ls -l -a
ls -la
ls -al

# 命令: 整条shell命令的主体
# 选项: 用于调节命令的输出效果
    #以 “-”引导短格式选项(单个字符),例如“-a”,     “ -c”
    #以“--”引导长格式选项(多个字符),例如“--all”,  “--color”
    #多个短格式选项可以写在一起,只用一个“-”引导,例如“-al”
# 参数: 命令操作的对象,如文件、目录名等
# 选项和参数可以出现位置调换,命令,选项,参数之间要至少有一个空格
# 命令必须开头, 选项和参数位置可以发生变化

ps: Linux中隐藏文件以 .开头
# .bash_profile配置用户环境变量的地方,该文件在每个用户家目录下(包括root)
# .bshrc 在root路径下,这个是系统环境变量

 

7、Bash Shell基本特性

7.1 命令补全

当使用windows查找一个目录层级特别多的文件时,打开的效率会非常的慢,但如果使用linux查找一个目录层级特别多的文件时,可以通过tab键快速的补全

PS: tab键可以实现命令补全,路径补全,在实际生产中tab补全往往是我们使用的最多的, 因为可以减少执行命令以及路径出错率。

# ifconfig查看ip地址,cmd中为ipconfig,在centos7的版本没有(替换为ip addr命令),需要装软件
# yum provides ifconfig
# yum install net-tools

#查看ip时忘记具体了命令
[root@lqz ~]# ifcon
#按下tab键会自动补全
[root@lqz ~]# ifconfig

#按一下tab键没有反应, 按两下tab键列出所有if开头的命令
[root@lqz ~]# if
if         ifconfig   ifenslave  ifrename
ifcfg      ifdown     ifnames    ifup

#linux目录较深,经常使用tab键进行补全, 如果路径出错是没有办法补全(带斜线表示是目录(window叫文件夹))
[root@lqz ~]# ls /etc/sysconfig/network-scripts/

# 安装选项补全
yum install bash-comple*
yum install bash-completion -y  # 安装过程直接选择yes
# ls -- 两下Tab建,所有的选项都会提示出来,空格上下翻

7.2 命令快捷键,快捷键可以帮助我们大大提升工作效率

Ctrl + a    #光标跳转至正在输入的命令行的首部
Ctrl + e    #光标跳转至正在输入的命令行的尾部
Ctrl + c    #终止前台运行的程序
Ctrl + d    #在shell中,ctrl-d表示退出当前shell。
Ctrl + z    #将任务暂停,挂至后台
Ctrl + l    #清屏,和clear命令等效。
Ctrl + k    #删除从光标到行末的所有字符
Ctrl + u    #删除从光标到行首的所有字符
Ctrl + r    #搜索历史命令, 利用关键字,Tab建选中,只能找到最近的一条
Ctrl + w    #按单词或空格进行向前删除
Ctrl + 左右建 #按单词或空格进行向前向后跳

#在命令行前加面加 "#" 则该命令不会被执行

7.3 历史命令History, 追溯之前发生情况

 -w 保存命令历史到历史文件
 -c 清空命令历史记录, 不会清空文件
 -d 删除命令历史的第 N 条行

#1. history 查看历史命令

#2. 使用双 !! 可执行上一条执行过的命令
[root@lqz ~]# ls
lqz.com
[root@lqz ~]# !!
ls
lqz.com

#3. 输入!6, 执行history命令历史中第 6 行命令
[root@lqz ~]# !6
touch lqz.com

#4. 使用!cat, 调用history命令历史最近一次执行过的cat命令
[root@lqz ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
[root@lqz ~]# !cat  # 最近一次
cat /etc/sysconfig/network-scripts/ifcfg-eth0

#5. 使用!yum, 调用history命令历史最近一次执行过的yum命令

[root@lqz ~]# ls /etc/passwd
#调用上一条命令的最后参数或选项, 按下ESC松开, 然后按下 "."
[root@lqz ~]# cat
[root@lqz ~]# cat /etc/passwd
#第二种方式, 输入!$
[root@lqz ~]# ls !$
ls /etc/passwd
/etc/passwd

# history -d 100   删除第100条历史记录
# history -c       清空记录(保存到文件中的还有)
# history -w       保存历史集合,保存到当前用户的家目录 .bash_history文件中
# > .bash_history  清空文件的保存(操作完,不让别人看你执行的命令)

注意:>左边没东西,就表示把空白写入文件,等于是清空文件,清空文件一定要仔细,如果清空了系统环境变量文件,就只能去快照中找了

7.4 命令别名

命令别名将用户经常使用的复杂命令简单化, 可以用"alias 别名名称=命令"命令创建属于自己的命令别名, 若要取消一个命令别名,则是用unalias 别名名称命令。

#1.定义临时别名, 只在当前bashshell中生效
[root@lqz ~]# alias wk='ifconfig'
# alias 查看一下是否成功,发现系统内置了很多
[root@lqz ~]# wk
# 取消别名(都是临时的),只是针对当前bashshell,如果写到配置文件中,取消的话需要去配置文件删除
[root@lqz ~]# unalias wk 

#2.如果定义命令本身, 会执行什么?
[root@lqz ~]# alias ifconfig='ifconfig eth0'
#绝对路径执行, 调用命令本身
[root@lqz ~]# /sbin/ifconfig
#通过转义字符, 调用命令本身
[root@WebServer ~]# ifconfig

#3.设置别名永久生效
[root@lqz ~]# echo "alias wk='ifconfig'" >> /etc/bashrc
# echo是打印这句话,加了>> 相当于把这句话写到文件,/etc/bashrc 是全局环境变量,可以写入用户自己的环境变量

#4.内置的别名:在系统和用户的环境变量的配置文件中放着
例如:ls命令也是一个别名,通过alias ls查看ls是哪个命令的别名==> 'ls --color=auto' 
      ll命令也是一个别名,通过alias ll查看ll是哪个命令的别名==> 'ls -l --color=auto' 
    
#5. /bin/ls -al /root  
# bin下的这个ls是原始命令,通过这种方式也可以执行,查root下的所有文件和文件夹的详情(同一颜色)
# 如果用别名, ls -al /root 查出来一样,只不过文件夹有颜色

 

8、Bash Shell获取帮助

8.1 命令 –help帮助

[root@lqz ~]# ls --help
用法: ls [选项]...[文件]...

#ls 常见选项
-a  #查看目录下的所有文件,包括隐藏文件
-l  #以长格式的方式显示文件的详细内容
-h  #以人性化的方式显示内容,配合-l使用
-d  #只列出目录名,不列出目录以下的内容
-t  #按修改时间进行排序
-i  #显示文件的inode(该文件在该分区的一个编号)

[root@lqz ~]# date --help
Usage: date [OPTION]... [+FORMAT]
  or:  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
  
[root@lqz ~]# date +%F   #查看日期
2019-03-28
[root@lqz ~]# date -s 12:00  #修改时间

#时间不是用来查看,而是有其他的用途
[root@web01 ~]# touch `date +%F`_file.txt
[root@web01 ~]# ls
2019-03-28_file.txt

8.2 命令 man手册

# man ls 查看命令的详细用法

8.3 linux命令大全url传送门

linux命令大全

linux命令手册

 

9、Bash Shell命令流程

9.1 当我们执行一个命令, 整个命令执行流程如下:

1) 判断命令是否通过绝对路径执行
2) 判断命令是否存在alias别名
3) 判断用户输入的是内部命令还是外部命令
4) Bash内部命令直接执行,外部命令检测是否存在缓存
5) 通过PATH路径查找命令,有执行,无报错

9.2  什么是内部命令,什么是外部命令

内部命令: shell程序自带的命令。
外部命令: 在系统PATH变量的某个路径下的可执行程序。

9.3 如何检查用户输入的命令是内部命令还是外部命令

#cd命令属于shell内部命令
[root@linux-node1 ~]# type -a cd
cd is a shell builtin
cd is /usr/bin/cd

#ping属于外部命令, 同时会打印当前命令路径
[root@lqz ~]# type -a  ping
ping is /bin/ping

9.4 如果是外置命令,Bash可以通过查找PATH变量,获取该命令的绝对路径

#打印当前环境变量目录
[root@lqz ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

PS: PATH由多个路径组成,每个路径值之间用冒号间隔,对这些路径的增加和删除操作都将影响到Bash解释器对Linux命令的查找

 9.5 如果是外置命令还会涉及到一个内存缓存,也就是说,当我们出现重复执行相同的命令,会通过缓存调取执行,也就意味着不会搜索PATH路径

#表缓存命令所在位置
[root@lqz ~]# hash
hits    command
   1    /usr/bin/tty
   3    /sbin/ifconfig

#已缓存命令,如果移动位置会导致无法找到该命令
[root@lqz ~]# mv /sbin/ifconfig /bin/
[root@lqz ~]# ifconfig
-bash: /sbin/ifconfig: No such file or directory

#删除缓存过的ifconfig命令, 即可执行
[root@lqz ~]# hash -d ifconfig
[root@lqz ~]# ifconfig

#当然可以清空缓存表
[root@lqz ~]# hash -r

#注意: 命令缓存hash需要注意如下情况:
1.只要执行外部命令1次就会对该命令进行缓存
2.如果将命令移动了位置,该如何执行
    a.使用绝对路径执行
    b.删除hash表的缓存指令

 9.6 命令执行流程总结: 当我们执行了一个ping命令之后, 整个命令执行的流程步骤如下:

1) 检查执行的命令是否使用的是绝对路径执行的。
2) 检查ping命令是否存在alias别名
3) 检查ping命令是内部命令还是外部命令
4) 如果是内部命令Bash直接执行,如果是外部命令,首先检查Hash缓存,存在则直接调取
5) 如果该命令不存在Hash缓存,则通过PATH路径进行逐行查找该命令所在的位置
6) 如果PATH路径没有查找到该命令所在的路径,则返回错误码。command not found

 

posted @ 2022-10-02 21:22  不会钓鱼的猫  阅读(205)  评论(0编辑  收藏  举报