Jenkins从机复制slave.jar时出现权限被拒绝的问题

14
我收到了权限被拒绝的错误,但不知道为什么。从我的jenkins主机上,我能够使用ssh-rsa密钥运行以下命令: scp /var/cache/jenkins/war/WEB-INF/slave.jar jenkins@<my_slave_host>:/var/jenkins/ 注意:当我看到它不存在时,我手动在我的从机上创建了/var/jenkins/并将其归属于jenkins用户。我的主机jenkins配置为使用.jenkins@mySlaveHost使用ssh密钥。
有任何想法为什么我会被拒绝访问?它试图做什么?
这是来自主jenkins的日志,点击[启动slave代理]按钮后:
[02/27/15 15:18:01] [SSH] Opening SSH connection to <my_slave_host>:22.
[02/27/15 15:18:02] [SSH] Authentication successful.
[02/27/15 15:18:03] [SSH] The remote users environment is:
BASH=/bin/bash
BASHOPTS=cmdhist:complete_fullquote:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_EXECUTION_STRING=set
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="3" [2]="11" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='4.3.11(1)-release'
CATALINA_HOME=/opt/tomcat/current
DIRSTACK=()
EUID=107
GROUPS=()
HOME=/var/lib/jenkins
HOSTNAME=*********** REMOVED***********
HOSTTYPE=x86_64
IFS=$' \t\n'
JAVA_HOME=/usr/lib/jvm/java-7-oracle
LANG=en_US.UTF-8
LOGNAME=jenkins
MACHTYPE=x86_64-pc-linux-gnu
MAIL=/var/mail/jenkins
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
PIPESTATUS=([0]="0")
PPID=10592
PS4='+ '
PWD=/var/lib/jenkins
SHELL=/bin/bash
SHELLOPTS=braceexpand:hashall:interactive-comments
SHLVL=1
SSH_CLIENT='10.57.13.32 34436 22'
SSH_CONNECTION='10.57.13.32 34436 10.57.6.42 22'
TERM=dumb
UID=107
USER=jenkins
XDG_RUNTIME_DIR=/run/user/107
XDG_SESSION_ID=42
_=']'
[02/27/15 15:18:03] [SSH] Checking java version of java
[02/27/15 15:18:04] [SSH] java -version returned 1.7.0_76.
[02/27/15 15:18:04] [SSH] Starting sftp client.
[02/27/15 15:18:04] [SSH] Copying latest slave.jar...
hudson.util.IOException2: Could not copy slave.jar into '/var/jenkins' on slave
    at hudson.plugins.sshslaves.SSHLauncher.copySlaveJar(SSHLauncher.java:1019)
    at hudson.plugins.sshslaves.SSHLauncher.access$300(SSHLauncher.java:133)
    at hudson.plugins.sshslaves.SSHLauncher$2.call(SSHLauncher.java:709)
    at hudson.plugins.sshslaves.SSHLauncher$2.call(SSHLauncher.java:696)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: hudson.util.IOException2: Could not copy slave.jar to '/var/jenkins/slave.jar' on slave
    at hudson.plugins.sshslaves.SSHLauncher.copySlaveJar(SSHLauncher.java:1016)
    ... 7 more
Caused by: com.trilead.ssh2.SFTPException: Permission denied (SSH_FX_PERMISSION_DENIED: The user does not have sufficient permissions to perform the operation.)
    at com.trilead.ssh2.SFTPv3Client.openFile(SFTPv3Client.java:1201)
    at com.trilead.ssh2.SFTPv3Client.createFile(SFTPv3Client.java:1074)
    at com.trilead.ssh2.SFTPv3Client.createFile(SFTPv3Client.java:1055)
    at hudson.plugins.sshslaves.SFTPClient.writeToFile(SFTPClient.java:93)
    at hudson.plugins.sshslaves.SSHLauncher.copySlaveJar(SSHLauncher.java:1008)
    ... 7 more
[02/27/15 15:18:04] Launch failed - cleaning up connection
[02/27/15 15:18:04] [SSH] Connection closed.

编辑: 这里是从属服务器上的 /var/jenkins:

$ ls -al
total 436
drwxr-xr-x  2 jenkins jenkins     22 Feb 27 15:17 .
drwxr-xr-x 14 root    root      4096 Feb 27 15:12 ..
-rw-r--r--  1 jenkins jenkins 439584 Feb 27 15:17 slave.jar

关于SFTP,我认为它未启用,你能指向任何说明文档表明SFTP是从属机的先决条件吗?我看到的所有页面都没有提到SFTP。


你能否编辑你的问题,添加关于远程服务器上/var/jenkins的权限和所有权信息?例如,运行“ls -ld /var/jenkins”并将输出添加到问题中?如果该目录中存在slave.jar文件,请同时包括该文件的权限信息。 - Kenster
就我所看到的日志来说,Jenkins正在使用SFTP,而您个人正在使用SCP。您也可以尝试通过SFTP传输一些文件,以重现Jenkins遇到的问题。 - vania-pooh
7个回答

12

看起来问题与您的远程根目录设置有关。它需要是slave.jar的位置,因为Jenkins将尝试从那里执行它。

至于权限,无论您将远程根目录设置为什么,都需要配置以允许Jenkins访问它。

因此,如果在您的情况下更改远程根目录设置为/var/jenkins/,它应该可以成功启动Jenkins从机。


谢谢伙计,就是这样! - dlite922
对我不起作用。从机和主机都有相同的Jenkins路径**/var/lib/jenkins**。SSH也连接正常,权限也正确。我错过了什么,请帮忙。从机主机 - ALLSYED
你应该在自己的问题中添加更多数据。你的问题可能与我的不同。 - dlite922

4
授予权限
sudo chmod -R 777 /var/lib/jenkins 

适用于我的情况

对于 Windows 代理,右键单击 C:\Jenkins -> 属性 -> 安全 -> 然后添加 Jenkins 登录的服务用户并授予完全控制权限。 - b15
对我也有效,但这到底是在做什么? - Arghya
它为所有用户授予/var/lib/jenkins目录的读取、写入和执行权限。 - Pavan Jadda
使用chmod -R 777打开文件是不安全的。这是一种安全风险。 - user1241663

3
sudo chmod -R 777 /var/jenkins      

2

请确保将jar文件复制到的位置具有已登录用户(即jenkins)的权限。

使用以下命令检查权限:

ls -l directory_name

很可能你会找到另一个所有者,因此请使用以下方式更改所有者:

chown -R username:username directory_name

那对我有效!


0
如果您更改了用户以连接到从服务器,请确保从服务器目标目录为空(不包含先前用户复制到其中的slave.jar)。 这有点愚蠢,但浪费了我的时间。

0

对于任何拥有外部驱动器的人来说,请检查它是否正确挂载:

drwxrwxrwx+  2 App   admin   68 Aug 25 19:33 Jenkins_Support
drwxrwxr-x  19 App   staff  714 Sep 25 10:46 Jenkins_Support 1

这可能是一个问题


-1
在Ubuntu终端中检查:
服务ufw状态
如果处于活动状态,则运行:
服务ufw stop 在Redhat终端中检查:
服务iptables状态
如果处于活动状态,则运行:
服务iptables stop 服务ip6tables状态 如果处于活动状态,则运行: 服务ip6tables stop 然后检查jenkins-slave-node状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接