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

时间:2016-06-16 11:08:00

标签: bash unix jenkins ssh expect

我有一个jenkins工作,它有自己的一组构建服务器。我遵循的过程是在jenkins构建服务器上构建应用程序,然后我使用"发送文件或通过ssh"执行命令。复制我的构建并使用shell脚本部署它。

作为部署命令的一部分,我有很多步骤要做,比如mkdir,tar -xzvf等。我想与特定的用户" 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

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

2 个答案:

答案 0 :(得分:1)

即使你使用它,从安全的角度来看,在脚本或命令行中使用密码可能并不理想。我建议两件事:

1)在启动系统上使用用户拥有的公共SSH密钥作为远程系统上的授权密钥,以允许在没有密码的情况下以远程系统上的目标用户身份登录。您应该拥有所需的一切(不需要root访问权限,仅限于您已在每个系统上使用的用户)。

2)设置&#34; sudoers&#34;远程系统上的文件,以便您登录的用户可以执行所需的用户命令。您需要系统管理员帮助。

答案 1 :(得分:0)

像这样:

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

<强>后来

  

我如何在第一个片段中使用它?

写一个文件:

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