gpt4 book ai didi

bash - 使用 shell 脚本通过 ssh 进入实例后无法切换到 root 用户

转载 作者:行者123 更新时间:2023-12-04 08:27:13 24 4
gpt4 key购买 nike

我有一个场景,可以通过多个 VM 节点上的 shell 脚本自动执行手动构建更新过程。
同样,我尝试使用下面的示例脚本首先通过 ssh 进入实例,然后切换到 root 用户以执行进一步的步骤,例如将构建复制到/var 下的存档目录,然后继续执行后面的步骤。
下面是示例脚本,

#!/bin/sh
publicKey='/path/to/publickey'
buildVersion='deb9.deb build'
buildPathToStore='/var/cache/apt/archives/'
pathToHomedir='/home'

script="whoami && pwd && ls -la && whoami && mv ${buildVersion} ${buildPathToStore} && find ${buildPathToStore} | grep deb9"

for var in "$@"
do
copyBuildPath="${publicKey} ${buildVersion} ${var}:/home/admin/"
echo "copy build ==>" ${copyBuildPath}
scp -r -i ${copyBuildPath}
ssh -i $publicKey -t $var "sudo su - & ${script}; " # This shall execute all commands as root
done
所以上面脚本的 CLI 统计信息是这样的
admin //this is the user check
/home/admin
total 48
drwxr-xr-x 6 admin admin 4096 Dec 6 00:28 .
drwxr-xr-x 6 root root 4096 Nov 17 14:07 ..
drwxr-xr-x 3 admin admin 4096 Nov 17 14:00 .ansible
drwx------ 2 admin admin 4096 Nov 23 18:26 .appdata
-rw------- 1 admin admin 5002 Dec 6 17:47 .bash_history
-rw-r--r-- 1 admin admin 220 May 16 2017 .bash_logout
-rw-r--r-- 1 admin admin 3506 Jun 14 2019 .bashrc
-rw-r--r-- 1 admin admin 675 May 16 2017 .profile
drwx------ 4 admin admin 4096 Nov 23 18:26 .registry
drwx------ 2 admin admin 4096 Jun 21 2019 .ssh
-rw-r--r-- 1 admin admin 0 Dec 6 19:42 testFile.txt
-rw------- 1 admin admin 2236 Jun 21 2019 .viminfo
admin

如果我使用 sudo su -c 并删除 &
喜欢:
ssh -i $publicKey -t $var "sudo su -c ${script}; "
然后一次 whoami 以 root 身份返回用户,但工作目录仍然打印为 /home/admin 而不是 /root
下一组命令仍然是 admin 用户而不是 root 用户。因此 admin 用户无权将构建移动到存档目录并安装构建。
使用 & 我想确保在后台完成进一步的步骤。
不知道如何继续这个。现在非常欢迎好的建议:)

最佳答案

"sudo su - & ${script}; "

扩展为:
sudo su - & whoami && pwd && ...
第一 sudo su -在后台运行。然后执行命令链。
 sudo su -c ${script}; 

扩展为:
 sudo su -c whoami && pwd && ...
所以先 sudo su - whoami执行,运行 whoami作为根。那么如果这条命令成功了,那么 pwd被执行。作为普通用户。
使用 ssh 正确传递要在远程站点上执行的命令是非常困难的。越来越难用 sudo su - 命令将被三重(或两次?)分词 - 一次由 ssh,然后由 shell ,然后由 sudo su 运行的 shell .
如果您不需要交互式通信,最好使用带有 -s 的 here 文档。 shell 选项,一些东西(未经测试):
# DO NOT store commands to use in a variable.
# or if you do and you know what you are doing, properly quote it (printf "%q ") and run it via eval
script() {
set -euo pipefail
whoami
pwd
ls -la
whoami
mv "$buildVersion" "$buildPathToStore"
find "$buildPathToStore" | grep deb9
}

ssh ... "sudo bash -s" <<EOF
echo "Yay! anything here!"
echo "Note that here document delimiter is not quoted!"
$(
# safely import context to work with
# note how command substitution is executed on host side
declare -f script
# pass variables too!
declare -p buildVersion buildPathToStore buildPathToStore
)
script

EOF

关于bash - 使用 shell 脚本通过 ssh 进入实例后无法切换到 root 用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65203617/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com