使用变量提供密码以成为 Jenkins 中的 sudo 用户

Providing password using a variable to become a sudo user in Jenkins

我有一份 jenkins 工作,它有自己的一套构建服务器。我遵循的过程是在 jenkins 构建服务器上构建应用程序,然后我使用 "send files or execute commands over ssh" 复制我的构建并使用 shell 脚本部署它。

作为部署命令的一部分,我有很多步骤要做,比如 mkdir,tar -xzvf etc.I 想用特定用户执行这些部署步骤 "K"。但是当我输入 sudo su - k 命令时,jenkins 作业失败了,因为我无法向它输入密码。

#!/bin/bash
sudo su - K << \EOF
cd /DIR1/DIR2;
cp ~/MY_APP.war .
mkdir DIR 3
tar -xzvf MY_APP.war
EOF

为了解决这个问题,我使用了 PASSWORD 参数并将构建设置为参数化,这样我就可以在 shell 脚本中使用相同的 PASSWORD。

我曾尝试使用 Expect,但看起来像 cd、tar -xzvf 这样的命令在其中不起作用,即使它们起作用,也不会以 K 作为用户执行,因为终端可能会过期(如有错误请指正)

export $PASSWORD
/usr/bin/expect << EOD
spawn sudo su - k
expect "password for K"
send -- "$PASSWORD"
cd /DIR1/DIR2;
cp ~/MY_APP.war .
mkdir DIR 3
tar -xzvf MY_APP.war
EOD

注意:我没有服务器的根访问权限,因此无法调整主机密钥文件。是否有解决此问题的方法?

像这样:

SUDO_PASSWORD=TheSudoPassword
...
ssh kilroy@somehost "echo $SUDO_PASSWORD | sudo -S some_root_command"

以后

How can i use this in the 1st snippet?

写入文件:

deploy.sh

#!/bin/sh
cd /DIR1/DIR2
cp ~/MY_APP.war .
mkdir DIR 3
tar -xzvf MY_APP.war

然后:

chmod +x deploy.sh
scp deploy.sh kilroy@somehost:~
ssh kilroy@somehost "echo $SUDO_PASSWORD | sudo -S ./deploy.sh"

即使您让它正常工作,从安全角度来看,在脚本或命令行中设置密码也可能不是理想的选择。我建议两件事:

1) 使用初始系统上用户拥有的 public SSH 密钥作为远程系统上的授权密钥,以允许在远程系统上以预期用户身份登录而无需密码。您应该拥有执行此操作所需的一切(不需要 root 访问权限,仅适用于您在每个系统上已经使用的用户)。

2) Set-up 远程系统上的 "sudoers" 文件,以便允许您登录的用户作为所需用户执行您需要的命令。您需要系统管理员的帮助。