tree命令。用于以树状结构显示目录和文件。通过运行 “tree” 命令可视化地查看文件系统中的目录结构。
tree /
systemd是第一个系统进程(pid=1)不启动,其他进程也没法启动,
用pstree查看进程树
我们可以看到所有进程都是systemd的子进程 ,所以别的进程能够运行的前提是systemd运行。
如何查看进程
下图是在虚拟机中以图形化界面查看空间使用情况
dev/loop0,1,2都是内存的使用情况,(sr0是光盘的使用情况),sda1,3是物理磁盘的使用情况
用命令查看资源使用情况
ps aux 可查看这一秒系统运行的所有进程
该进程情况不是实时,只是把当下这一刻的进程罗列出来。比较适合检索某一个进程
a
ps -ef查看进程情况,除了可以看到进程pid,还可看到当前进程的父进程id是多少
ppid是父进程id,systemd是没有父进程id的所以ppid=0
top命令,实时查看进程的动态变化(每三秒更新一次进程的使用情况。如果想要每秒刷新用 top -d 1 (秒数)
上面是资源的使用情况,下面是进程的活动情况。
上面的最后两行是,内存的使用情况和交换空间的使用情况(解决内存不足时产生的,其占用的硬盘的空间)
按数字1可扩展开来查看cpu的使用情况
ps命令,
单独使用时,只能列出当前正在运行的进程,如上表示bash和ps命令正在运行
每个进程都有id号,可通过kill命令进行管理(向进程pid发送命令
kill -9 pid 强制关闭
kill -15 pid 正常关闭
kill -19 pid 停止进程
kill -18 pid 将停止的进程继续去运行
(补充:在远程登录时加上-X,远程连接一台由图形化界面的机器,当前机器也要支持图形化界面,(在foundation0机器打开,在workstation中查看)
当我们执行一个操作比较费时,又无法继续使用命令行继续操作,只能等待该进程执行时,我们可以把其该费时操作放到后台进行例如
打开firefox浏览器,在后面加个&,则是放到后台执行的意思,
【1】表示作业队列,6739表示进程数
可通过kill -15 6739 结束该进程,也可以是kill -15 %1(表示关闭第一个作业)
但是有一个关于DISPLAY环境变量的配置问题,我不懂(希望后面可以解决,先记一下)
(补充:强制关闭vim 编辑的文件,会产生碎片文件,等下次编辑要先删除该碎片文件
右图打开了vim正在编辑abc.txt,在左边查找该界面的进程数, 当我们用kill -9 强制结束该进程(虽然已保存,但未退出该界面)后,
当我们再用vim 打开该文件,可以发现
这就是产生了碎片文件,按照下面绿色字体的提示,可以进行编辑,但是我们知道
如果输入d则可以删除当前内容,然后可以回归我们原本的编辑内容。
如果是e则继续编辑之前的内容,但是我们在再次打开该文件时又会发现,仍会出现该内容,这时我们可以知道时因为存在.abc.txt.swp文件
所以我们可以删除该文件(rm -f .abc.txt.swp),再次打开则不会出现上上个画面的内容
如果我们在编辑一个文件,当我们直接关闭终端,再登录打开该文件可以发现也会出现上述的文本内容,这时我们页可删除相应的碎片文件。
关于kill -19和-18
在左边查询bash界面的进程数,在右边用kill -19 停止该进程。我们可以发现左边的命令行不可以继续执行命令。
若要恢复则用kill -18 恢复该进程
这样左边的命令行又可以继续执行操作
控制服务和守护进程
systemd守护进程管理Linix的启动,一般包括服务启动和服务管理。可在系统引导时以及运行中的系统上激活系统资源、服务器守护进程和其他进程。(总的来说systemd相当于食物链顶端)
守护进程是在执行各种任务的后台或运行的进程,一般情况下,守护进程在系统引导时自动启动并持续运行至关机或手动停止。许多守护进程的名字以字母d结尾
例如sshd是远程登录的守护进程,该进程由systemd进行管理
如果是用户需要手动对进程进行管理时不是使用进程的名字,这些进程由专门的管理命令systemctl(用户管理单元
可用systemctl -t help查看可用的单元类型
如果要查看每个单元的内容(systemctl list-units
(补充systemctl list-units命令显示systemd服务尝试解析并加载到内存中的单元,它不显示已安装但未启用的服务。如果要查看所有已安装的文件单元的状态,可用systemctl list-unit-files)
STATE字段的有效条目有enabled、disabled、static、masked
查看具体某个类型 --type(如下查看workstation上安装的所有服务单元)
如上所述sshd.service(sshd全名)
(--all 加上以后,如上表示列出workstation上所有活动和不活动的服务单元
systemctl 不带参数,可列出已加载和活动的单元
查看进程状态
systemctl status name.type( 也可以是直接写服务的名字不用写后缀
systemctl stop 服务 关闭服务
stop后:
输入密码后
发现该服务状态为inactive
systemctl start 服务 开启服务
systemctl restart 服务 重新开启(重新读取配置文件)
状态输出中可以找到表示服务状态的几个关键字
浏览服务状态(如下浏览sshd服务的状态)
systemctl is-enable 命令可以验证服务是启用还是禁用状态
控制系统服务
(用systemctl resart 服务 来重新启动服务,其进程ID会改变,并且在启动期间会关联新的进程ID。而某些服务可以重新加载其配置文件,而无须重新启动。这个过程称为服务重新加载,其不会更改与各种服务进程关联的进程ID。
systemctl reload 服务 (如果不确定服务是否具有重新加载配置文件更改的功能,可以使用命令 systemctl reload-or-restart 服务 这样执行的话,则可以在可以重新加载的前提下重新加载配置文件启动,否则则重新启动服务启动)
如上效果等同,说明sshd服务可以重新加载配置文件启动
如图理解即是,查看别的服务依赖该本服务,反向则是自己依赖别的服务
(dmesg可以查看开机时启动的服务等
init 0 关机 1单用户模式 2多用户无网络 3多用户 4无意义 5切换图形化 6重启=reboot(init控制进程rhel5由来,更高版本兼用)
使用ssh访问远程命令行
当没有指定用户名登录时,一般默认时当前用户名登录,
如果没有该用户则登录失败,所以一般都会指定用户名,除了ssh 服务器外,也可以时ssh ip 登录
exit退出登录
如果只是想登录别的用户执行少量操作,可以不用在该用户视图下操作(以要登录的用户身份运行要执行的命令,而不访问远程交互式shell
如图,直接在ssh命令后写上要执行的命令
w命令可显示当前登录到计算机的用户列表,可显示哪些用户使用ssh从哪些远程位置进行了登录及执行了何种操作
当用户使用ssh命令连接到SSH服务器时,该命令会检查它在本地已知主机文件中是否有该服务器的公钥副本,如果有,ssh就将其与收到的公钥比较,如果不匹配会请求用户确认是否要继续连接(不匹配时,客户端会假定服务器的网络流量已遭劫持或服务器已被入侵)
上图显示,我输入no则不继续连接,
如下我输入yes,并输入要登录的用户密码则成功连接登录
SSH已知主机公钥管理
所连接的每个远程SSH服务器都将其公钥存储在/etc/ssh目录下扩展名为.pub的文件中。
假设两台机器a,b。如果a想连接b,到那时在b上不小心把如上的公钥文件删除了,这时a是连接不上b,这时我们可以重新启动ssh服务,恢复文件
如下我们删除了公钥文件
退出b后再去登录,发现不可以
如下我们在被删除公钥文件的服务器b的终端中输入重启sshd服务的命令,则可以发现配置删除文件已还原
再次登录
因为公钥文件更新后内容与加密格式和以前不同,所以原来的旧钥匙也没有用了,当别的服务器尝试用旧钥匙去建立连接时,是不能成功连接登录的,
解决方法是让服务器把原来的旧钥匙删掉并更新新钥匙。我们知道当前用户的公钥存放在
~/.ssh/known_hosts
过滤得到该文件下存放serverb的旧的公钥
所以我们可以删除其旧公钥,即使该文件记录了别的用户的公钥,我们也可以直接将该文件内容全部删除,因为当我们再远程连接时,又会接收新的公钥
上面的情况是删除ssh_host开头的所有文件,没有全部删除
当删除/etc/ssh目录下的所有文件时,即使我们按如上操作重启sshd服务,而且重启后也只能恢复部分文件,发现还是登录不了b,(在这个过程中发现被删除的ssh_config文件还是很重要的,所以我时围绕恢复该文件来解决这个问题
如下删除了全部
再登录报错
解决方法:
尝试重新安装
openssh-server
包。运行以下命令来重新安装:sudo dnf reinstall openssh-server
这将重新安装
openssh-server
包,并在安装过程中生成默认的sshd_config
文件。重启SSH服务:在恢复
sshd_config
文件后,运行以下命令来重启SSH服务:sudo systemctl restart sshd
然后再登录就可以了
看到那个浮夸的框框包围的内容,大概就是说我们的公钥更新需要接收新的公钥才可以成功连接。后面的步骤仍按上个的例子的操作接收新的公钥即可。
看了网上还有其他方法去恢复ssh_config文件的,例如查找文件副本、在配置相同的机器上复制ssh_config文件,再将其放到/etc/ssh目录。
(补充:ssh服务使用的是22号端口(加密端口)telnet使用23号端口(明文端口)
配置基于SSH密钥的身份验证
当我们对服务器进行基于密钥SSH的认证,则下次登录别的服务器不需要输入密码,可以直接登录。(通过基于密钥的身份验证在不使用密码的情况下进行身份验证,这种身份验证基于私钥-公钥方案)
实施步骤如下:
1、生成 公私钥对 ssh-keygen
上图第一个:则是询问公钥存放路径,一般默认括号立的路径,直接回车继续就好。
生成后我们来查看一下存放位置(和known_hosts一样存放在家目录的.ssh目录下
id_rsa即是刚生成存放私钥的文件,id_rsa.pub是存放的公钥文件
2、将公钥拷贝给服务器 ssh-copy-id -i 公钥路径 要传递的服务器的root用户
传递成功后就不需要密码了,传递时需要输入密码
如果未在ssh-keygen提示时指定密语,则生成的私钥不受保护,这种情况下,任何拥有当前服务器私钥文件的人都可以使用其进行身份验证。如果设置密码则在使用私钥前需要输入密码才能使用会更安全。
如下ssh-keygen命令显示创建受密语保护的私钥及其公钥
如图我们登录从servera登录serverb需要输入密码,现在对其进行试验
如下第一条命令,生成一组具有密语保护的SSH密钥,并将密钥保存为~/.ssh/key-with-pass
后面发现登录serverb仍需要密码,如下图,将公钥拷贝过去后在登录
但如果是如下图使用对应的私钥对远程系统进行身份验证,同时通过SSH登录远程系统则可以登录
如图不用输入什么既可以登录,那是因为我们没有设置指定的密语,如下若为私钥设置了该密语
如图一开始是没有密码登录不上的,后面来进行实验
看到图上这个部分
其实我已经指定了保护私钥的密语,只是像输入密码一样没有显示出来,在后面用密钥验证登录时(ssh -i ~/.ssh部分)可以发现出现了输入密语的提示
后来我们对公钥进行传递,注意公钥是.pub结尾,我随意取得名叫free-name-key,所以转发时注意是free-name-key.pub才是传递的公钥,否则是传递的私钥
如下图可以发现,在第一行中我们根据提示输入了之前自己指定的密语
这种登录方式是根据私钥验证来登录的(如果时ssh登录还需要输入密码)。后面的ssh-agent可以避免在使用SSH登录时以交互方式键入密语。
(这时临时插入的内容,所以不要因为图上服务器的名字和实验内容的不连贯而觉得奇怪)
使用
ssh-copy-id
命令将公钥添加到远程服务器应该是无需密码的。但是,如果你在生成公钥时设置了密码短语,则仍然需要输入密码才能解锁私钥并进行身份验证。密码短语是用于保护私钥的密码,而非用于SSH身份验证。这意味着即使你将公钥添加到目标服务器上,如果你的私钥受到密码短语的保护,那么在进行SSH连接时仍然需要输入密码短语。如果你不想每次SSH连接时都输入密码短语,可以考虑在运行
ssh-agent
时使用ssh-add
命令将私钥添加到代理中,并在第一次输入密码短语后,代理会在会话期间管理私钥的解锁。这样,SSH连接将不再需要输入密码短语。运行ssh-agent
(启动ssh-agent并运行这些命令以自动为该shell会话设置环境变量,此外,还显示ssh-agent进程的PID)
使用名为ssh-agent的程序临时将密语缓存到内存中,之后,当使用SSH通过私钥登录另一个系统时,ssh-agent会自动提供密码。
使用ssh-add将SSH密钥对的密语保护的私钥(/root/.ssh/ksy-with-pass)添加到shell会话
如图设置完成后则可以直接通过ssh登录serverb
关于ssh-add
意思是,若是默认的私钥文件名(或是路径)则在使用ssh-add时,要加上路径,且在用采用进行私钥的身份验证去登录时要加上-i选项,而且要在该路径前,如果是默认则不需要,直接ssh-add,私钥身份验证去登录时直接ssh 用户名@服务器即可
3、验证
(补充:当生成多个公私钥对,若名字相同,则新的会覆盖旧的,若名字不同,则共存。如果名字不同,OpenSSH会使用指定的公私钥对文件。使用不同的文件名可以让你在使用不同的公私钥对时进行区分。