声明!
学习视频来自B站up主 泷羽sec ,有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!
文章为个人学习笔记。
1、查看和使用环境变量
临时变量与永久变量:
-
临时变量:在当前会话中有效,关闭终端后消失。
-
永久变量:在系统配置文件中设置,对所有会话有效。
常见环境变量:
-
HOME:表示当前用户的主目录。例如,root用户的主目录是/root。
┌──(root㉿kali)-[~] └─# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games ┌──(root㉿kali)-[~] └─# echo $HOME /root
查看ls命令的路径:
-
使用which ls命令可以查看ls命令的脚本所在路径。这是因为ls命令在PATH环境变量中定义的路径中。
┌──(root㉿kali)-[~] └─# which -a ls ls: aliased to ls --color=auto /usr/bin/ls /bin/ls
查看PATH环境变量:
-
使用echo $PATH命令可以查看当前的PATH环境变量。PATH变量中包含了多个目录,系统会在这些目录中查找可执行文件。
-
示例输出:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games,表示系统会在这些目录中查找可执行文件。
┌──(root㉿kali)-[~] └─# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
理解PATH的作用:
-
当执行ls命令时,系统会在PATH中定义的目录中查找ls可执行文件,并执行它。这就是为什么可以直接执行ls命令而不需要指定完整路径。
变量
方法(一):放入环境变量的目录中
-
根据上述方法,可以将自定义的脚本(如1.sh)直接放入/usr/bin/目录中,这样在终端中就可以直接执行该脚本,而不需要指定完整路径。
┌──(root㉿kali)-[~/work]
└─# vim 1.sh
┌──(root㉿kali)-[~/work]
└─# ls
1.sh 2.sh 3.sh exam
┌──(root㉿kali)-[~/work]
└─# cat 1.sh
echo longyu.com
┌──(root㉿kali)-[~/work]
└─# mv 1.sh /usr/bin/
┌──(root㉿kali)-[~/work]
└─# 1.sh
longyu.com
┌──(root㉿kali)-[~/work]
└─# ls
2.sh 3.sh exam
方法(二)临时变量
export 临时变量
有效期限:临时改变,只能在当前的终端窗口中有效,当前窗口关闭后就会恢复原有的path配置
用户局限:仅对当前用户
修改PATH环境变量以包含特定的目录,使得该目录下的程序可以直接执行。
通过将/root/目录添加到PATH环境变量中,可以让/root/目录下的文件直接执行。
第一种(可以)
使用export命令:
-
export PATH=/root:$PATH:这条命令将/root/目录添加到当前PATH环境变量的前面。$PATH表示当前的PATH环境变量值,这样新的PATH变量值会在原有的值前面加上/root/。
-
export命令用于设置环境变量,使得设置的变量可以在当前shell以及由该shell启动的子进程中生效。
┌──(root㉿kali)-[~/work] └─# export PATH=/root:$PATH
PATH环境变量的重要性:
-
PATH定义了系统在哪些目录下去寻找可执行程序。当你在命令行输入一个命令(如ls、cat等)时,系统会根据PATH环境变量所指定的目录顺序去查找对应的可执行文件,找到后就执行它。
查看PATH环境变量:
-
echo $PATH:这条命令用于查看当前的PATH环境变量值,可以看到/root/目录是否已经被添加到PATH中。
-
┌──(root㉿kali)-[~] └─# echo $PATH /root:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
/root:$PATH的含义:
-
这里通过:PATH的形式保留了原来的值并添加了新的部分。这样做的结果是,当系统去查找可执行程序时,会先在/root目录下查找,然后再按照原来PATH所指定的其他目录顺序查找。
通过修改PATH环境变量来包含特定的目录,使得该目录下的程序可以直接执行。这是通过使用export命令来实现的,export命令可以确保变量的设置对当前shell及其子进程有效。通过这种方式,可以方便地管理哪些目录下的程序可以直接通过命令行执行。
验证
在端口中,2.sh直接运行
┌──(root㉿kali)-[~]
└─# 2.sh
holll,word
打开另一个的端口,输入2.sh命令无法实现
第二种(可以)
使用export命令:
命令export PATH=/root:PATH的意图是将/root目录添加到PATH的最前面,但是这个命令实际上会覆盖掉原来的PATH值,只留下/root目录。这意味着,除非/root目录下有您想要执行的命令,否则您将无法执行其他目录下的命令,因为PATH不再包含那些目录。
正确的命令应该是使用冒号(:)将新路径添加到现有的PATH变量后面,如下所示:
export PATH=$PATH:/root
查看PATH环境变量:
-
echo $PATH:这条命令用于查看当前的PATH环境变量值,可以看到/root/目录是否已经被添加到PATH中。
-
┌──(root㉿kali)-[~] └─# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/root
使用命令
使用2.sh命令
┌──(root㉿kali)-[~]
└─# 2.sh
longyu.com
在另一个终端,无法使用2.sh
设置永久环境变量
永久变量:
-
export命令设置的环境变量是临时的,只在当前会话中有效。要使环境变量永久生效,需要将其写入配置文件中。
第一种(不行)
编辑配置文件:
/root目录下:1.sh文件
/root/work/2.sh文件
┌──(root㉿kali)-[~]
└─# vim /root/1.sh
┌──(root㉿kali)-[~]
└─# chmod +x 1.sh
┌──(root㉿kali)-[~]
└─# ./1.sh
wor1.shh
┌──(root㉿kali)-[~]
└─# vim /root/work/2.sh
┌──(root㉿kali)-[~]
└─# ls
1.sh 公共 模板 视频 图片 文档 下载 音乐 桌面 Desktop
┌──(root㉿kali)-[~]
└─# mkdir work
┌──(root㉿kali)-[~]
└─# vim /root/work/2.sh
┌──(root㉿kali)-[~]
└─# chmod +x /root/work/2.sh
┌──(root㉿kali)-[~]
└─# /root/work/2.sh
word2.sh
┌──(root㉿kali)-[~]
└─#
-
使用vi .bashrc命令打开当前用户的.bashrc文件。.bashrc是Bash shell的配置文件,用于定义环境变量和其他shell启动时执行的命令。
-
在.bashrc文件中添加export PATH=/root:$PATH,这样每次打开新的终端会话时,/root目录都会被添加到PATH环境变量中。
在根目录下使用命令。
┌──(root㉿kali)-[~] └─# cd / ┌──(root㉿kali)-[/] └─# usr/bin/vi .bashrc
.bashrc文件内容。
export PATH=/root:$PATH
export PATH=$PATH:/root/work
cat命令查看下。
┌──(root㉿kali)-[/]
└─# usr/bin/cat .bashrc
export PATH=/root:$PATH
export PATH=$PATH:/root/work
使配置生效:
-
使用source命令(或者.命令)来重新加载.bashrc文件,使新设置的环境变量立即生效。这可以避免关闭并重新打开终端。
-
命令示例:source .bashrc或. .bashrc。
┌──(root㉿kali)-[/] └─# source usr/bin/ .bashrc ┌──(root㉿kali)-[/] └─# 1.sh 1.sh:未找到命令
验证设置:
-
打开一个新的终端窗口,然后使用echo $PATH命令来检查PATH环境变量是否包含了/root目录。
-
如果/root目录出现在输出中,说明设置成功。
┌──(root㉿kali)-[/]
└─# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
验证脚本执行:
-
如果在/root目录下有一个可执行脚本1.sh,可以在新的终端窗口中直接输入1.sh来执行它,而不需要指定完整的路径。如果脚本能够直接执行,说明PATH环境变量设置正确。
第二种.bashrc文件(不可以)
只会影响当前用户。
在Linux系统中修改.bashrc文件以添加新的环境变量路径的方法。可以用于永久性地修改当前用户的PATH环境变量,使得/root目录被添加到PATH中。
确认脚本位置和权限
-
确保脚本2.sh存在于/root目录下,且具有可执行权限。
-
如果没有执行权限,可以使用以下命令来赋予权限:
┌──(root㉿kali)-[~]
└─# chmod +x /root/2.sh
┌──(root㉿kali)-[~]
└─# ls -la
-rwxr-xr-x 1 root root 16 11月15日 10:18 2.sh
修改.bashrc文件
-
打开.bashrc文件:
使用vim编辑器打开当前用户的.bashrc文件。这个文件通常位于用户的主目录下,文件名为.bashrc。使用命令:vim ~/.bashrc
-
添加环境变量:
在文件的末尾添加以下行:export PATH=/root:$PATH export PATH=$PATH:/root/work 或 export WORK_HOME="/root/work" export PATH="$WORK_HOME:$PATH"
这行命令的作用是将/root目录添加到当前用户的PATH环境变量的开头。$PATH是一个特殊的环境变量,它包含了系统在执行命令时搜索可执行文件的目录列表。
-
保存并退出:
在vim中,按Esc键退出编辑模式,输入:wq保存更改并退出。 -
生效方法
-
重新打开终端:
关闭当前终端窗口,重新打开一个新的终端窗口。这样,新的.bashrc配置就会被加载,环境变量也会更新。 -
立即生效:
在当前终端窗口中输入以下命令,使更改立即生效:source ~/.bashrc
或者使用.命令:
. ~/.bashrc
问题报错
问题如下。
┌──(root㉿kali)-[~]
└─# source ~/.bashrc
找不到命令 “shopt”,您的意思是:
“shout” 命令来自 Debian 软件包 libshout-tools
尝试 apt install <deb name>
找不到命令 “shopt”,您的意思是:
“shout” 命令来自 Debian 软件包 libshout-tools
尝试 apt install <deb name>
找不到命令 “shopt”,您的意思是:
“shout” 命令来自 Debian 软件包 libshout-tools
尝试 apt install <deb name>
找不到命令 “shopt”,您的意思是:
“shout” 命令来自 Debian 软件包 libshout-tools
尝试 apt install <deb name>
complete:未找到命令
complete:未找到命令
complete:未找到命令
complete:未找到命令
complete:未找到命令
complete:未找到命令
complete:未找到命令
complete:未找到命令
complete:未找到命令
_comp_dequote__initialize:unset:2: no such hash table element:
/usr/share/bash-completion/bash_completion:615: parse error near &'
\[\e]0;\u@\h: \w\a\]\[\033[;94m\]┌──(\[\033[1;31m\]\u㉿\h\[\033[;94m\])-[\[\033[0;1m\]\w\[\033[;94m\]]\n\[\033[;94m\]└─\[\033[1;31m\]$\[\033[0m\]
解决方法和验证:
当前的端口窗口可以
┌──(root㉿kali)-[~]
└─# echo $SHELL
/usr/bin/zsh
┌──(root㉿kali)-[~]
└─# bash
┌──(root㉿kali)-[~]
└─# source ~/.bashrc
┌──(root㉿kali)-[~]
└─# 2.sh
holll,word
验证脚本执行:
-
如果在/root目录下有一个可执行脚本2.sh,可以在新的终端窗口中直接输入2.sh来执行它,而不需要指定完整的路径。如果脚本能够直接执行,说明PATH环境变量设置正确。
┌──(root㉿kali)-[/]
└─# 2.sh
2.sh:未找到命令
有效期限和用户局限
-
有效期限:永久有效,直到再次修改.bashrc文件或者系统配置发生变化。
-
用户局限:这些更改只会影响当前用户。如果需要为所有用户设置环境变量,可能需要编辑/etc/profile或/etc/environment文件,或者为每个用户单独设置。
第三种profile(不行)
有效期限:永久有效
用户局限:对所有用户
编辑profile文件:
您使用vim编辑器打开/etc/profile文件,这是Linux系统中用于设置环境变量的全局配置文件。
vim source /etc/profile
添加root路径到PATH:
方法1:
在/etc/profile文件中找到设置PATH的行,并添加/root:到该行的开头。这样做可以将/root目录添加到PATH环境变量中,使得可以在任何位置通过命令行调用/root目录下的可执行文件。
export WORK_HOME=/root/work
export PATH=$PATH:$WORK_HOME
或
export PATH=/root:$PATH
或
export PATH=$PATH:/root
这条命令的作用是将/root目录添加到当前的PATH环境变量前面。$PATH是一个特殊的环境变量,它包含了系统在执行命令时搜索可执行文件的目录列表。
方法2
/root目录下:1.sh文件
/root/work/2.sh文件
以下是修改后的代码段:
if [ "$(id -u)" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/root/work"
fi
export PATH
请注意,我在PATH变量的末尾添加了:/root,这样/root就会被添加到PATH环境变量的末尾。如果想要将/root添加到PATH的开头,可以这样写:
if [ "$(id -u)" -eq 0 ]; then
PATH="/root:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/root/work:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH
生效方法:
系统重启:重启系统会重新加载/etc/profile文件,从而更新PATH环境变量。
立即生效:如果您不想重启系统,可以通过在终端执行以下命令来立即使更改生效:
source /etc/profile
或者使用.命令,它的作用与source相同:
. /etc/profile
这两个命令都会重新加载/etc/profile文件,更新当前会话的环境变量。
方法一查看:
┌──(root㉿kali)-[~/work]
└─# source /etc/profile
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/.dotnet/tools:/root/work
# 2.sh
houll,work
# cd work
cd: 没有那个文件或目录: work
# ls
2.sh exam s.sh
# 2.sh
houll,work
# cd /
# 2.sh
houll,work
#
方法二查看:
变量的目录写在第一个if语句PATH中
第一个
/root目录下:1.sh文件
/root/work/2.sh文件
文件会执行:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root",1.sh文件可以运行。
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/root/work
2.sh文件bu可以运行。
┌──(root㉿kali)-[~]
└─# source /etc/profile
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root:/root/.dotnet/tools
# 1.sh
work1.sh
# 2.sh
2.sh:未找到命令
#
第二个
/root目录下:1.sh文件
/root/work/2.sh文件
文件会执行:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/work",2.sh文件可以运行。
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/root
1.sh文件不可以运行。
┌──(root㉿kali)-[~]
└─# source /etc/profile
# 1.sh
1.sh:未找到命令
# 2.sh
word2.sh
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/work:/root/.dotnet/tools
#
验证:
打开新窗口。没有成功
┌──(root㉿kali)-[~]
└─# 2.sh
2.sh:未找到命令
┌──(root㉿kali)-[~]
└─# cd /
┌──(root㉿kali)-[/]
└─# 2.sh
2.sh:未找到命令
┌──(root㉿kali)-[/]
└─#
第四种:(可以)
生效方法:系统重启
有效期限:永久有效
通过修改environment文件:
vim /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"中加入“:/root”
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/root
COMMAND_NOT_FOUND_INSTALL_PROMPT=1
POWERSHELL_UPDATECHECK=
查看:
┌──(root㉿kali)-[~]
└─# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/root
验证:
打开新窗口。
┌──(root㉿kali)-[~]
└─# ls
2.sh 公共 模板 视频 图片 文档 下载 音乐 桌面 go reports tool work
┌──(root㉿kali)-[~/work]
└─# 2.sh
hell,word
$PATH 的顺序
export PATH=$PATH:/root 和 export PATH=/root:$PATH 这两个命令都用于修改 PATH 环境变量,但它们添加 /root 目录到 PATH 的顺序不同,这可能会影响在命令行中执行命令时的搜索顺序。
-
export PATH=$PATH:/root
-
这条命令将 /root 目录添加到 PATH 环境变量的末尾。这意味着,当您在命令行中输入一个命令时,系统会先在 PATH 中已有的目录列表中搜索该命令,如果找不到,最后才会在 /root 目录中搜索。
例如,如果 /usr/bin 在 PATH 中,并且 /usr/bin 和 /root 目录下都有名为 somecommand 的可执行文件,系统会先找到并执行 /usr/bin/somecommand,而不会执行 /root/somecommand。
-
-
export PATH=/root:$PATH
-
这条命令将 /root 目录添加到 PATH 环境变量的开头。这意味着,当您在命令行中输入一个命令时,系统会先在 /root 目录中搜索该命令,然后才会在 PATH 中已有的其他目录中搜索。
例如,如果 /usr/bin 在 PATH 中,并且 /usr/bin 和 /root 目录下都有名为 somecommand 的可执行文件,系统会先找到并执行 /root/somecommand,而不会执行 /usr/bin/somecommand。
-
总结来说,两个命令的主要区别在于搜索命令时的优先级不同。export PATH=/root:$PATH 使得 /root 目录下的命令具有更高的优先级,而 export PATH=$PATH:/root 则保留了原有的搜索顺序,/root 目录下的命令具有较低的优先级。在实际使用中,选择哪种方式取决于您希望哪个目录下的命令具有更高的执行优先级。
2、字符串操作
变量使用:
┌──(root㉿kali)-[~]
└─# name="xiaoyu" age="27"
┌──(root㉿kali)-[~]
└─# echo "my name is $name , and my age is $age years old"
my name is xiaoyu , and my age is 27 years old
获取字符串长度:
-
在Shell脚本中,可以使用${#变量名}来获取变量的字符串长度。
-
例如,如果有一个字符串变量str="hello world",可以使用echo ${#str}来打印这个字符串的长度。
┌──(root㉿kali)-[~]
└─# str="hello wolrd"
┌──(root㉿kali)-[~]
└─# echo ${#str}
11
打印完整字符串:
-
要打印一个字符串变量的完整内容,可以直接使用echo ${变量名}。
-
例如,echo ${str}会打印出hello world。
┌──(root㉿kali)-[~]
└─# str="hello wolrd"
┌──(root㉿kali)-[~]
└─# echo ${str}
hello wolrd
截取字符串的特定部分:
-
在Shell脚本中,可以使用${变量名:起始位置:长度}来截取字符串的特定部分。
-
例如,echo ${str:0:3}会从字符串str的第0个位置开始,截取长度为3的子字符串,即hel。
┌──(root㉿kali)-[~]
└─# echo ${#str:0:3}
3
┌──(root㉿kali)-[~]
└─# echo ${str:0:3}
hel