在以下脚本中,我尝试在Jenkinsfile中插入i的值。
host='10.0.0.1 10.0.0.2'
sh 'for i in $host; do echo \"$i\" ; \
sshpass -p root ssh -o StrictHostKeyChecking=no root@${i} \'echo "* * * * * script/test.ksh 6432 \${i} abc xyz" > /var/spool/cron/root\'; \
done'
它正在控制台上打印最后的$ {i},但是它正确地插入了第一个$ {i}。我在哪里做错了?
它在jenkins控制台上打印像下面的
sshpass -p root ssh -o StrictHostKeyChecking=no root@10.0.0.1 'echo " * * * * * scripts/test.ksh 6432 ${i} abc xyz" > /var/spool/cron/root'
答案 0 :(得分:0)
您尝试遍历包含值的字符串,而不是遍历值数组。
普通外壳(即/bin/sh
)可能不是解决问题的最简单方法。您也不需要利用awk,perl,python或其他任何工具。只需使用KornShell(/bin/ksh
或/usr/bin/ksh
,具体取决于您的UNIX环境)。而且您似乎确实在创建KornShell脚本(test.ksh
)。
我将在macOS上使用/bin/ksh
。
现在旋转字符串非常简单:
typeset host='10.0.0.1 10.0.0.2'
typeset -a hosts=( $host )
现在hosts
是一系列可以迭代的项目。您可以通过输入以下内容来验证这一点:
print -v hosts
将输出:
(
10.0.0.1
10.0.0.2
)
您可以按如下所示简化上面的代码,但是我建议保持上面的语法:
host='10.0.0.1 10.0.0.2'
hosts=( $host )
所以现在我们知道了如何访问字符串中的每个主机。这回答了您最初的问题。但是,我建议您进行进一步的修改,以避免引用和问题。
为此,我建议使用单独的KornShell脚本,说update-remote-crontabs.ksh
并以以下方式调用它:
/path/to/update-remote-crontabs.ksh $host
脚本的内容为:
#! /bin/ksh
typeset user=root
typeset host
for host in $@; do
sshpass -p $user ssh -o StrictHostKeyChecking=no $user@$host \
$'echo \'* * * * * script/test.ksh 6432 '$host' abc xyz\' > /var/spool/cron/user'
done
请注意,使用$'
定义ANSI C字符串,使用'$host'
将host
变量连接到我们的文字字符串中。
还请注意,我们不必将原始字符串转换为数组,因为在调用脚本时,解释器会自动完成此操作:-)
据我所知,最后的评论> /var/spool/cron/root
是一种不好的做法。您可能应该喜欢以下类似的东西:
(crontab -l; echo '* * * * * script/test.ksh 6432 '$host' abc xyz') | crontab -
快乐的KornShell!