我有Jenkins 1.6在CentOS 7.2上运行。 我有Windows 2012服务器,我想从Jenkins服务器接收生成。 这些Windows服务器不在域中。 他们安装了OpenSSH。 在Jenkins服务器上,我手动创build了这个path(从Linux控制台):/home/jenkins/.ssh/
我给了.ssh文件夹完全开放的权限。 然后,我运行一个Jenkins的工作,只发生在Linux服务器上。 这是使用这些命令的Execute Shell作业:
cd /tmp/ ssh-keygen -t rsa -N "" -f great.key mv great.key.pub /home/jenkins/.ssh/ mv great.key /home/jenkins/.ssh
这些命令应该为Jenkins用户生成一个SSH密钥对。 我不知道如何用Jenkins用户login到Linux服务器。 所以我想出了以上。
然后手动将.ssh目录的权限设置为600.我将.pub文件的内容复制到Windows服务器上的authorized_keys文件中,特别是C:\ Users \ jenkins.ssh \
Windows服务器上的authorized_keys文件和.ssh文件夹都具有安全权限,其中只有pipe理员组分别完全控制文件和和文件夹。 然后我运行了一个Jenkins版本,这是一个Execute Shell脚本。 这是三行:
ssh -t -t jenkins@xxxx echo "something" > foo.txt exit
我在控制台输出中得到这个:
…拒绝权限,请重试。 …构build步骤'执行shell'标记的构build失败…
我如何让在Linux上运行的Jenkins与Windows服务器通信? 我宁愿不在Windows服务器上安装Cygwin。 有许可证问题。 这样做需要时间,我认为这是没有必要的。
为了调查发生了什么,在插件的exec部分和运行脚本中都使用了一些基本的命令。 首先,您必须比较部署脚本和工作文件夹的path。 在我的情况下脚本deploingpath是/home/jenkins/deploy和命令的execpath是/home/jenkins 。 例如使用dirs命令。 另外考虑使用绝对path和/或cd命令。
那么你可能会注意到,用Windows编写的脚本具有CRLF行结束,而在Linux中编写时只有LF。 这里的翻译在非本原的脚本中看到额外的东西并对待它们:
Linux解释器会在每个预期的\n行尾之前看到额外的\r字符,并对其进行处理:
作为每个命令中的额外参数。 它可能会从命令中产生意外的争论。
# |normal line-end echo "something" > foo.txt \r\n # ^arg pipe^ target^ ^argument of target? exit
作为空行的未知命令
# |normal line-end \r\n #^unknown command
Windows解释器会看到额外的\n字符(并且看不到预期的\r\n ),并将它们和下一个命令作为第一个命令的一个参数列表
# |>no line-end echo "something" > foo.txt \n exit # ^arg pipe^ target^ ^---^-arguments of target
我使用发布通过SSH插件为jenkins和倒转的情况:构build机器(源)运行Windows和部署机器(目标)运行Linux(Ubuntu)。