代码案例:在shell脚本中切换用户之后再执行多个函数以及执行多行命令

代码案例

自己写的一部分案例代码,目的是解决在shell脚本中切换用户之后再执行多个函数以及执行多行命令的问题

#!/bin/bash

# 切换用户
func1() {
  # 函数体
  echo "函数体1,用户是$1"
}

func2() {
  # 函数体
  echo "函数体2,用户是$1"
}


func3(){
# id -u为当前用户的uid,root用户uid为0,根据uid是否为0,判断当前用户是否是root
if [ $(id -u) -eq 0 ]; then
        echo "当前用户为root用户,将切换为$1用户"
        su - $1 bash -c "source /usr/local/shell_01/t4.sh && func1 $1"
        su - $1 bash -c "source /usr/local/shell_01/t4.sh && func2 $1"

        su - $1 <<EOF
echo "当前用户是:$(whoami)"
pwd
EOF

    fi

}

echo "------------------------------------------"

func3 $1

echo "------------------------------------------"



func4(){
su - $1 <<EOF
echo "当前用户是:$(whoami)"
# 多行命令
pwd
ls


func1() {
  # 函数体
  echo "函数体1,用户是$(whoami)"
}

func2() {
  # 函数体
  echo "函数体2,用户是$(whoami)"
}

func1
func2

EOF
}


func5(){
su -c "whoami" - $1<<EOF
pwd
EOF

}

echo "*****************************************"
if [ "$1" == "atguigu" ];then
func4 $1

func5 $1
fi
echo "*****************************************"

保存后,给予脚本运行权限,

chmod +x t4.sh

并执行

. t4.sh atguigu

注意:atguigu是linux中普通用户

运行结果如下:
在这里插入图片描述

案例解释

代码主要注意:

su - $1 bash -c "source /usr/local/shell_01/t4.sh && func1 $1"

该行代码中source /usr/local/shell_01/t4.sh 表示运行t4.sh
也就是运行该行代码时,t4.sh脚本就会再次运行一次

为了不造成无限的递归循环,就加了判断和参数
注意:该行代码中source /usr/local/shell_01/t4.sh 运行时t4.sh后是没有参数的

所以该行代码中source /usr/local/shell_01/t4.sh 运行时,因为脚本中的判断条件,
所以只会执行脚本中的函数,相当于加载函数

结果解释

运行结果分成这几个部分

脚本执行到以下代码:

if [ $(id -u) -eq 0 ]; then
        echo "当前用户为root用户,将切换为$1用户"

输出

------------------------------------------
当前用户为root用户,将切换为atguigu用户
------------------------------------------



脚本执行到以下代码:

su - $1 bash -c "source /usr/local/shell_01/t4.sh && func1 $1"

输出
为啥会输出******************************这个呢?
因为脚本初次执行到该代码时,执行source /usr/local/shell_01/t4.sh
会再一次执行该脚本,所以会输出 ******************************

------------------------------------------
*****************************************
*****************************************
函数体1,用户是atguigu
------------------------------------------




脚本执行到以下代码:

su - $1 bash -c "source /usr/local/shell_01/t4.sh && func2 $1"
su - $1 <<EOF
echo "当前用户是:$(whoami)"
pwd
EOF

输出:

------------------------------------------
*****************************************
*****************************************
函数体2,用户是atguigu
上一次登录:一 58 22:12:34 CST 2023pts/2 上
当前用户是:root
/home/atguigu
------------------------------------------




脚本执行到以下代码:

echo "*****************************************"
if [ "$1" == "atguigu" ];then
func4 $1

func5 $1
fi
echo "*****************************************"

输出:
这里出现了一个问题
代码中有echo "当前用户是:$(whoami)"
其中whoami命令表示会显示当前用户是谁
那么为什么从root用户切换到atguigu用户之后执行该命令,
还是输出当前用户是root呢
在shell脚本中设置了切换用户后执行whoami命令,为什么whoami命令显示用户是之前为切换时的用户

*****************************************
上一次登录:一 58 22:12:34 CST 2023
当前用户是:root
/home/atguigu
函数体1,用户是root
函数体2,用户是root
atguigu
*****************************************

在shell脚本中设置了切换用户后执行whoami命令,为什么whoami命令显示用户是之前为切换时的用户

在shell脚本中切换用户后执行whoami命令,可能会出现whoami命令显示用户是之前为切换时的用户的情况。这是因为whoami命令是根据当前进程的有效用户ID来确定当前用户的身份的,而在切换用户后,当前进程的有效用户ID并没有改变,仍然是切换前的用户ID。因此,为了正确地获取切换后的用户身份,可以使用su命令来切换用户,并在su命令后面加上-c参数来执行需要执行的命令,例如:

su -c "whoami" - username

其中,-表示使用当前用户的环境变量,-c表示执行后面的命令,username表示需要切换到的用户。这样就可以正确地获取切换后的用户身份了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值