使用shell脚本在ssh进入实例后无法切换到root用户



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

#!/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用户负责。因此,管理员用户没有权限将构建移到归档目录并安装构建。

使用&我要确保在幕后采取进一步的步骤。不知道如何继续进行。好的建议现在最受欢迎:(

"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。

如果您不需要交互式通信,最好使用带有-sshell选项的here文档,以及(未经测试的(:

# 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

当您单独使用su时,它会将您保留在实际目录中,如果您使用su -,它会模拟root登录。你应该写:su - root -c ${script};

相关内容

  • 没有找到相关文章

最新更新