专业编程基础技术教程

网站首页 > 基础教程 正文

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

ccvgpt 2024-11-21 11:09:46 基础教程 5 ℃

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

1: 修改默认shell

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

Linux进阶笔记-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 三的小角落 -- 首页 查阅之前的文章。

Tags:

最近发表
标签列表