已解决,已添加更新脚本- 感谢 @steeldriver 和 @user10489
Shell 打印输出混乱并且缺少一些信息。
我对 Linux 还很陌生,还处于复制/粘贴并查看结果的阶段。
我已经尝试过谷歌搜索,但无济于事。
我正在运行一个脚本,它采用多种方式返回当前用户。
该脚本使用
- 直接呼叫
- 使用调用
sudo
- 使用调用
sudo su -
每个方法都应该返回 7 个值,但第一个和第二个方法返回 5 个值,第三个方法返回全部 7 个值。
有问题的脚本:
#!/usr/bin/env bash
echo ""
echo "GET USER - DIRECT"
echo ""
whoami
echo $USER
id -u -n
logname
ps -o user= -p $$ | awk '{print $1}'
echo $SUDO_UID
echo $SUDO_USER
echo ""
read -p "Press enter to continue"
echo -e "\n"
echo "GET USER - SUDO"
echo ""
sudo whoami
sudo echo $USER
sudo id -u -n
sudo logname
sudo ps -o user= -p $$ | awk '{print $1}'
sudo echo $SUDO_UID
sudo echo $SUDO_USER
echo ""
read -p "Press enter to continue"
echo -e "\n"
echo "GET USER - SUDO SU -"
echo ""
sudo su -c 'whoami; echo $USER; id -u -n; logname; ps -o user= -p $$ | awk "{print $1}"; echo $SUDO_UID; echo $SUDO_USER; echo ""'
echo -e "\n"
我得到的输出:
player1@Arcade:~/Desktop$ ./testuser.sh
GET USER - DIRECT
player1
player1
player1
player1
player1
Press enter to continue
GET USER - SUDO
[sudo] password for player1:
root
player1
root
player1
player1
Press enter to continue
GET USER - SUDO SU -
root
root
root
player1
root
1000
player1
我在这里遗漏了什么?我的假设是直接调用$SUDO_UID
和与$SUDO_USER
权限有关。但是打印输出的顺序仍然让我感到困惑。
编辑:
理解用法sh -c
、正确引用和访问 $SUDO_xxxxx 变量就成功了。
另外,我无法正确计数。该脚本旨在返回 7 个值,而不是 6 个。
更新后的脚本现在运行正常。
感谢你们的帮助!
我更新的脚本:
#!/usr/bin/env bash
echo ""
echo "GET USER - DIRECT"
echo ""
whoami
echo $USER
id -u -n
logname
ps -o user= -p $$ | awk '{print $1}'
sh -c 'echo $SUDO_UID'
sh -c 'echo $SUDO_USER'
echo ""
read -p "Press enter to continue"
echo -e "\n"
echo "GET USER - SUDO"
echo ""
sudo whoami
sudo echo $USER
sudo id -u -n
sudo logname
sudo ps -o user= -p $$ | awk '{print $1}'
sudo sh -c 'echo $SUDO_UID'
sudo sh -c 'echo $SUDO_USER'
echo ""
read -p "Press enter to continue"
echo -e "\n"
echo "GET USER - SUDO SU -"
echo ""
sudo su -c 'whoami'
sudo su -c 'echo $USER'
sudo su -c 'id -u -n'
sudo su -c 'logname'
sudo su -c 'ps -o user= -p $$ | awk '"'"'{print $1}'"'"
sudo su -c 'sh -c '"'"'echo $SUDO_UID'"'"
sudo su -c 'sh -c '"'"'echo $SUDO_USER'"'"
echo -e "\n\n"
我的更新输出:
player1@Arcade:~/Desktop$ ./testuser.sh
GET USER - DIRECT
player1
player1
player1
player1
player1
Press enter to continue
GET USER - SUDO
[sudo] password for player1:
root
player1
root
player1
player1
1000
player1
Press enter to continue
GET USER - SUDO SU -
root
root
root
player1
root
1000
player1
这里有两个问题:
$
字符串没有正确加引号,因此在传递给 sudo 之前就被替换了。如果您不想提前替换它们,请用单引号或反斜杠将它们括起来。该引号将被删除,然后将$
传递给以下命令。$
由 shell 完成...在某个地方。因此,如果您在没有 shell 的情况下运行该命令(即直接通过 sudo),则它只会回显原始内容$var
。sh -c
提供第二个 shell。例如:
这是我的原始外壳
...即使 sudo 运行了 echo,原始 shell 也进行了替换。
没有 shell —— 命令未被解析,因此 sudo 尝试将其查找
echo $$
为可执行文件(其中带有空格)。没有进行替换...原始内容
$$
已被打印。新的 shell 和新的 pid 进行命令解析和替换
并且原始 shell pid 仍然相同
评论中引用的文章(“为什么如果我使用 sudo,$HOME 不会改变?”)是一个独立但相关的问题。许多变量
$
不是由 shell 设置的,而是来自环境,并且 sudo 会根据配置文件和命令行选项选择性地传递一些未改变的变量,选择性地过滤其他变量,并选择性地更改其他变量。您似乎对某些命令从何处获取信息感到困惑。
$$
是本地 shell 常量,用“当前”shell 的 pid 替换手册页
logname
没有说明它从哪里获取信息,但我猜它是从登录到当前终端的人那里获取信息的。$SUDO_UID
和$SUDO_USER
是 sudo 专门为调用 sudo 的用户设置的环境变量,而不是 sudo 切换到的用户;这在 sudo 手册页中明确说明,因此不会造成混淆。