百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

Linux进阶笔记-Shell命令终端的使用和修改以及简单的高阶使用

sinye56 2024-11-12 12:42 2 浏览 0 评论

shell会根据提示执行程序。当你发出一个命令时,shell会搜索该程序,然后执行它。例如,当你输入命令ls时,shell会搜索名为ls的工具/程序,然后在shell中运行它。提供给实用程序的参数和选项会影响您得到的结果。shell也被称为CLI或命令行界面。

1: 修改默认shell

大多数现代发行版都预先安装了BASH(又是Bourne SHell),并将其配置为默认SHell。

chsh (changeshell)是Linux中负责修改shell的命令(实际上是可执行二进制文件,ELF)。

首先可以使用chsh -l命令检查机器上已经安装和配置了哪些shell,输出结果类似于下面这样:

[demouser@vbox ~]$ chsh -l
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/usr/bin/tmux
/bin/tmux
/usr/bin/zsh
/bin/zsh

在某些Linux发行版中(如:Ubuntu),chsh -l命令是无效的。在本例中,所有可用shell的列表也可以在 /etc/shells 文件中找到。你可以用 cat 命令显示文件内容:

demouser@demohosts:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/usr/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/usr/bin/dash

现在我们可以选择新的默认shell,例如sh,并使用chsh -s对其进行配置。

[demouser@vbox ~]$ chsh -s /usr/bin/zsh
Changing shell for demouser.
密码: 
Shell changed.

现在剩下要做的就是执行一个 退出-重新登陆 的循环,然后就可以享受我们新的默认shell。

如果您希望为不同的用户更改默认shell,并且您在计算机上具有超级管理员或者 sudo 的权限,则可以像root用户一样使用 chsh 命令来完成此操作。假设我们想将 user_2 的默认 shell 更改为 zsh ,使用和之前我们用过的命名相同的命令,但在后面再追加一个用户名的参数,chsh -s /usr/bin/zsh user_2.

为了检查当前的默认 shell 是什么,我们可以查看$SHELL环境变量,它指向默认shell的路径,因此在我们的更改之后,我们期望得到类似的结果:

[demouser@vbox]~% echo $SHELL
/usr/bin/zsh

下面是chsh --help的输出结果,列出了chsh可用的选项和使用的格式:

[root@vbox demouser]# chsh --help

Usage:
 chsh [options] [<username>]

Change your login shell.

Options:
 -s, --shell <shell>  specify login shell
 -l, --list-shells    print list of shells and exit

 -h, --help           display this help
 -V, --version        display version

2: 基础的Shell实用程序

自定义Shell提示符

默认的命令提示符可以更改,使其看起来不同和简短。如果当前目录太长,默认命令提示符会变得太大。在这些情况下,使用PS1很有用。简短而定制的命令漂亮而优雅。在下表中,PS1与一些参数一起使用,以显示不同形式的shell提示。默认的命令提示符看起来像这样:

user@host ~ $ 

在我的例子中,它看起来像这样:

demouser@vbox ~ $

它可以按照下表进行更改:

配置内容

示例和说明

PS1='\w #39;

~ $ 目录名称作为Shell提示符,在本例中,~为用户的家目录。

PS1='\h $ '

gotham $ 主机名作为Shell提示符

PS1='\u $ '

bruce $ 用户名作为Shell提示符

PS1='\t $ '

22:37:31 $ 24小时格式时间作为Shell提示符

PS1='\@ $ '

10:37 PM 12小时格式时间作为Shell提示符

PS1='\! $ '

732 显示命令的历史编号作为Shell提示符

PS1='dude $ '

dude $ 以你自己喜欢的字符串作为Shell提示符

一些基本的 shell 快捷键

快捷键

说明

Ctrl-k

剪切

Ctrl-y

粘贴

Ctrl-a

将光标移动到行首

Ctrl-e

将光标移动到行尾

Ctrl-d

删除光标所在位置的字符

Ctrl-l

清屏,清除掉当前屏幕上所有的内容,只留下光标所在的行为最上面的一行

Ctrl-u

删除从提示符到光标所在位置之间的字符

Ctrl-_

(要输入下划线,需要按Shift键,所以此处的快键键应该为 Ctrl - Shift - 减号 )撤销在命令行中输入的最后一个内容

Ctrl-c

中断/停止 在前台运程的程序/进程

Ctrl-r

反向历史搜索

重要的文件 ~/.bash_history和命令history

~/.bash_history: 存储shell上最近使用的500个命令/事件

history: 将显示命令历史

history | grep <key-word> 将显示历史上所有具有关键字<关键字>的命令(在您记住过去使用的命令的部分内容时很有用)

3: 创建自己的命令别名

如果你厌倦了在bash中使用冗长的命令,你可以创建自己的命令别名。

最好的方法是在主文件夹中修改(如果不存在,则创建)一个名为.bash_aliases的文件。通用语法是:

alias command_alias='actual_command'

其中actual_command是您要重命名的命令,command_alias是您给它的新名称。

例如:

alias apt-install='sudo apt-get -y install'

将新的命令别名 apt-install 映射到实际的命令 sudo apt-get -y install。这意味着当你在终端中使用apt-install 时,bash 会将其解释为 sudo apt-get -y install

4: 在系统中找到一个文件

Using bash you can easily locate a file with the locate command. For example say you are looking for the file mykey.pem:

使用 bash,您可以使用 locate 命令轻松定位文件。如果你是首次支持locate命令,可能会报错/var/lib/plocate/plocate.db: 没有那个文件或目录

[demouser@vbox ~]$ locate sshd_config
/var/lib/plocate/plocate.db: 没有那个文件或目录

那你需要先执行updatedb

[demouser@vbox ~]$ sudo updatedb

假设你要查找文件sshd_config:

[demouser@vbox ~]$ locate sshd_config
/etc/ssh/sshd_config
/etc/ssh/sshd_config.d
/usr/lib/systemd/sshd_config.d
/usr/lib/systemd/sshd_config.d/20-systemd-userdb.conf
/usr/share/man/man5/sshd_config.5.gz

上面的sshd_config这个文件名称有点长,如果你正在寻找这个文件,但是只记得它是一个 ssh 开头又好像有config 部分。中间是什么确忘了,此时可以使用管道将 locate 命令和 grep 命令结合起来,如下所示:

[demouser@vbox ~]$ locate ssh |grep config
/etc/crypto-policies/back-ends/libssh.config
/etc/crypto-policies/back-ends/openssh.config
/etc/crypto-policies/back-ends/opensshserver.config
/etc/libssh/libssh_client.config
/etc/libssh/libssh_server.config
/etc/ssh/ssh_config
/etc/ssh/ssh_config.d
/etc/ssh/sshd_config
/etc/ssh/sshd_config.d
/etc/ssh/ssh_config.d/20-systemd-ssh-proxy.conf
/etc/ssh/ssh_config.d/30-libvirt-ssh-proxy.conf
/etc/ssh/ssh_config.d/50-redhat.conf
/etc/sysconfig/sshd
/usr/lib/systemd/ssh_config.d
/usr/lib/systemd/sshd_config.d
/usr/lib/systemd/ssh_config.d/20-systemd-ssh-proxy.conf
/usr/lib/systemd/sshd_config.d/20-systemd-userdb.conf
/usr/share/crypto-policies/back-ends/DEFAULT/libssh.config
/usr/share/crypto-policies/back-ends/DEFAULT/openssh.config
/usr/share/crypto-policies/back-ends/DEFAULT/opensshserver.config
/usr/share/crypto-policies/back-ends/FIPS/libssh.config
/usr/share/crypto-policies/back-ends/FIPS/openssh.config
/usr/share/crypto-policies/back-ends/FIPS/opensshserver.config
/usr/share/crypto-policies/back-ends/FUTURE/libssh.config
/usr/share/crypto-policies/back-ends/FUTURE/openssh.config
/usr/share/crypto-policies/back-ends/FUTURE/opensshserver.config
/usr/share/crypto-policies/back-ends/LEGACY/libssh.config
/usr/share/crypto-policies/back-ends/LEGACY/openssh.config
/usr/share/crypto-policies/back-ends/LEGACY/opensshserver.config
/usr/share/man/man5/ssh_config.5.gz
/usr/share/man/man5/sshd_config.5.gz

执行的输出显示所有包含这两部分的结果,因为我搜索的是ssh而不是sshd,结果的内容比第一次搜出来的要多很多。

请注意,并非所有系统都安装了locate实用程序,而且许多系统没有启用它。Locate是快速有效的,因为它定期扫描您的系统并缓存其中每个文件的名称和位置,但如果该数据收集未启用,则它不能告诉您任何信息。你可以使用updatedb手动初始化文件系统扫描,以便更新文件系统上缓存的文件信息。

如果有的发行版本中没有安装locate这个查找工具,也可以使用find工具:

[demouser@vbox ~]$ sudo find / -name sshd_config -print
find: ‘/run/user/1000/gvfs’: 权限不够
find: ‘/run/user/1000/doc’: 权限不够
/etc/ssh/sshd_config

上面的命令全局搜索磁盘查找名为sshd_config的文件或目录。但因为每次运行时都必须扫描你的文件系统,而不是使用缓存的数据。这就导致了效率低下和速度慢,但更实时。find实用程序的功能远不止查找文件,但对其功能的完整描述超出了本示例的范围。


如果您对我的文章有兴趣,我把我发布的文章都归档到我私人网站中去,欢迎访问 Corner 三的小角落 -- 首页 查阅之前的文章。

相关推荐

RHEL8和CentOS8怎么重启网络

本文主要讲解如何重启RHEL8或者CentOS8网络以及如何解决RHEL8和CentOS8系统的网络管理服务报错,当我们安装好RHEL8或者CentOS8,重启启动网络时,会出现以下报错:...

Linux 内、外网双网卡路由配置

1.路由信息的影响Linux系统中如果有多张网卡的情况下,如果路由信息配置不正确,...

Linux——centos7修改网卡名

修改网卡名这个操作可能平时用不太上,可作为了解。修改网卡默认名从ens33改成eth01.首先修改网卡配置文件名(建议将原配置文件进行备份)...

CentOS7下修改网卡名称为ethX的操作方法

?Linux操作系统的网卡设备的传统命名方式是eth0、eth1、eth2等,而CentOS7提供了不同的命名规则,默认是基于固件、拓扑、位置信息来分配。这样做的优点是命名全自动的、可预知的...

Linux 网卡名称enss33修改为eth0

一、CentOS修改/etc/sysconfig/grub文件(修改前先备份)为GRUB_CMDLINE_LINUX变量增加2个参数(net.ifnames=0biosdevname=0),修改完成...

CentOS下双网卡绑定,实现带宽飞速

方式一1.新建/etc/sysconfig/network-scripts/ifcfg-bond0文件DEVICE=bond0IPADDR=191.3.60.1NETMASK=255.255.2...

linux 双网卡双网段设置路由转发

背景网络情况linux双网卡:网卡A(ens3)和网卡B(...

Linux-VMware设置网卡保持激活

Linux系统只有在激活网卡的状态下才能去连接网络,进行网络通讯。修改配置文件(永久激活网卡)...

VMware虚拟机三种网络模式

01.VMware虚拟机三种网络模式由于linux目前很热门,越来越多的人在学习linux,但是买一台服务放家里来学习,实在是很浪费。那么如何解决这个问题?虚拟机软件是很好的选择,常用的虚拟机软件有v...

Rocky Linux 9/CentOS Stream 9修改网卡配置/自动修改主机名(实操)

推荐...

2023年最新版 linux克隆虚拟机 解决网卡uuid重复问题

问题描述1、克隆了虚拟机,两台虚拟机里面的ip以及网卡的uuid都是一样的2、ip好改,但是uuid如何改呢?解决问题1、每台主机应该保证网卡的UUID是唯一的,避免后面网络通信有问题...

Linux网卡的Vlan配置,你可能不了解的玩法

如果服务器上连的交换机端口已经预先设置了TRUNK,并允许特定的VLAN可以通过,那么服务器的网卡在配置时就必须指定所属的VLAN,否则就不通了,这种情形在虚拟化部署时较常见。例如在一个办公环境中,办...

Centos7 网卡绑定

1、切换到指定目录#备份网卡数据cd/etc/sysconfig/network-scriptscpifcfg-enp5s0f0ifcfg-enp5s0f0.bak...

Linux搭建nginx+keepalived 高可用(主备+双主模式)

一:keepalived简介反向代理及负载均衡参考:...

Linux下Route 路由指令使用详解

linuxroute命令用于显示和操作IP路由表。要实现两个不同子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是为了解决以下问题:该...

取消回复欢迎 发表评论: