我在 CentOS 7.2 上运行 Jenkins 1.6。我有 Windows 2012 服务器,我想从 Jenkins 服务器接收构建。这些 Windows 服务器不在域中。它们安装了 OpenSSH。在 Jenkins 服务器上,我手动创建了此路径(从 Linux 控制台):/home/jenkins/.ssh/
我授予 .ssh 文件夹完全开放的权限。然后,我运行了一个 Jenkins 作业,该作业仅在 Linux 服务器本身上进行。这是一个执行 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 用户登录 Linux 服务器。所以我想到了上述方法。
然后我手动将.ssh目录的权限设为600。我将.pub文件的内容复制到Windows服务器上的authorized_keys文件中,具体来说是C:\Users\jenkins.ssh\中的文件
Windows 服务器上的 authorized_keys 文件和 .ssh 文件夹都具有安全权限,其中只有管理员组分别对文件和文件夹具有完全控制权。然后我运行了一个 Jenkins 构建,它是一个 Execute Shell 脚本。以下是三行:
ssh -t -t [email protected]
echo "something" > foo.txt
exit
我在控制台输出中得到这个:
... 权限被拒绝,请重试。... 构建步骤“执行 shell”将构建标记为失败...
如何让 Linux 上运行的 Jenkins 与 Windows 服务器通信?我不想在 Windows 服务器上安装 Cygwin。存在许可证问题。这样做需要时间,而且我认为没有必要。
答案1
要调查发生了什么,请在插件的执行部分和正在运行的脚本中使用一些基本命令。首先,您必须比较部署脚本和工作文件夹的路径。在我的例子中,脚本部署路径是/home/jenkins/deploy
,命令执行路径是/home/jenkins
。使用dirs
命令作为示例。还可以考虑使用绝对路径和/或cd
命令。
然后你可能会注意到,在 Windows 中编写的脚本有 CRLF 行尾,而在 Linux 中编写的脚本只有 LF。在这里,解释器在非本地脚本中看到了额外的内容并对其进行处理:
Linux 解释器在每个预期的行结束符
\r
前都会看到多余的字符,并将它们处理为:\n
作为每个命令中的额外参数。它可能会从命令中产生有关意外参数的警告。
# |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
我使用 Jenkins 的 Publish Over SSH 插件并反转情况:构建机器(源)运行 Windows 而部署机器(目标)运行 Linux(Ubuntu)。