【问题标题】:Maven ssh deploy using password, Permission deniedMaven ssh 使用密码部署,权限被拒绝
【发布时间】:2017-07-14 13:58:25
【问题描述】:

我正在尝试使用 maven 构建一个 jar 并自动将其 scp 到远程机器。

这是我的 pom.xml

<properties>
    <deploy.username>root</deploy.username>
    <deploy.host>10.10.4.10</deploy.host>
    <deploy.port>22</deploy.port>
    <deploy.dir>/root</deploy.dir>
</properties>

<distributionManagement>
    <repository>
        <id>repo1</id>
        <url>scpexe://${deploy.host}:${deploy.dir}</url>
    </repository>
</distributionManagement>

这是我的 settings.xml:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <servers>
    <server>
      <id>repo1</id>
      <username>root</username>
      <password>root</password>
    </server>
  </servers>  
</settings>

这是错误日志

Caused by: org.eclipse.aether.transfer.MetadataTransferException: Could not transfer metadata com.github.rssanders3.spark:spark_quick_start:1.0-SNAPSHOT/maven-metadata.xml from/to repo1 (scpexe://10.10.4.10:/root): Exit code: 1 - Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

    at org.eclipse.aether.connector.basic.MetadataTransportListener.transferFailed(MetadataTransportListener.java:43)
    at org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run(BasicRepositoryConnector.java:355)
    at org.eclipse.aether.util.concurrency.RunnableErrorForwarder$1.run(RunnableErrorForwarder.java:67)
    at org.eclipse.aether.connector.basic.BasicRepositoryConnector$DirectExecutor.execute(BasicRepositoryConnector.java:581)
    at org.eclipse.aether.connector.basic.BasicRepositoryConnector.get(BasicRepositoryConnector.java:222)
    at org.eclipse.aether.internal.impl.DefaultDeployer.upload(DefaultDeployer.java:417)
    ... 28 more
Caused by: org.apache.maven.wagon.TransferFailedException: Exit code: 1 - Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

你可以在here看到maven -X的完整输出

我正在使用以下命令提交:

mvn deploy -DskipTests --settings settings.xml

用户名和密码是正确的,我可以使用这个凭证ssh到它。我什至尝试将文件 scp 到远程,没有任何问题。

我检查了 maven 调试输出,它正在加载我创建的用户定义的 settings.xml。

[DEBUG] Reading user settings from /Users/xuanyue/tmp/apache-spark-quickstart-project/settings.xml

在 ssh 服务器端,这是我唯一得到的:

Feb 23 14:33:02 hadoop10 sshd[23804]: Connection closed by 192.168.100.26

我也试过用 scp 替换 scpexe。还是不行。

【问题讨论】:

  • 遵循 URI 标准.. 你的连接字符串不应该是scpexe://${deploy.host}/${deploy.dir}吗?

标签: java maven ssh


【解决方案1】:

尝试使用 -X 选项运行它:

mvn -X deploy -DskipTests --settings settings.xml

我怀疑问题可能与另一端的用户及其权限(不一定是文件系统权限)有关。

【讨论】:

    【解决方案2】:

    首先,您可以使用 -v(或 -vvv 进行完整调试)在您的服务器上重新启动 sshd,从而在您的安全文件中获得更多日志。

    在我看来,您正在尝试在服务器上进行 scp,您是否尝试过使用插件 org.apache.maven.wagon

    查看 Thivent 先生的帖子:Uploading a File via SCP with Maven fails

    【讨论】:

    • 是的,我正在使用 wagon,版本是 1.0-beta-6.. 与您指向的版本相同。但它没有显示如何使用密码进行配置。
    • 当您第一次通过 ssh 登录时,它是否要求您添加 RSA 密钥?我的意思是第一次使用您正在使用的笔记本电脑。
    • 您可能想在 settings.xml 中的配置中尝试两件事: 1. 使用服务器部分中的 filePermissions/directoryPermissions 参见maven.apache.org/plugins/maven-deploy-plugin/examples/… 2. 尝试禁用主机检查服务器端,见:stackoverflow.com/questions/2685988/…
    【解决方案3】:

    您可能需要用于 SSH 的 Maven Wagon Provider。请注意,它必须作为构建扩展添加。

    <project>
      ...
      <build>
        <extensions>
          <extension>
            <groupId>org.apache.maven.wagon</groupId>
             <artifactId>wagon-ssh</artifactId>
             <version>2.10</version>
          </extension>
        </extensions>
      </build>
      ...
    </project>
    

    如果您有这个 Wagon Provider,那么失败可能是由于您使用的是 Maven Wagon 的旧版本(您提到版本 1.0-beta-6),它可能与匹配的旧版本很好地匹配(但肯定不会与现代 maven-dist-plugin 配合得很好。

    不需要使用 Maven Wagon SSH 的 Beta 版本。 The current version as of now is 2.10.

    同样,我认为您不需要包含 Maven Wagon 插件 as the maven-dist-plugin doesn't use that plugin,它直接使用更现代的 wagon-provider-api。您应该只需要 SSH Wagon 扩展。

    最后,您应该从命令行运行远程sshd 实例进行测试(因此信息会发送到终端),并进行足够的调试以确定您是否到达测试框,以及您是否真的通过了在有效的凭据中(如 sshd 认为的那样)。

    请务必记住,sshd 具有拒绝 root 登录(如果已设置)的特定配置选项。如果您有权访问远程 sshd 框,您可能还需要验证 sshd 设置。

    【讨论】:

    • 我现在升级到2.10,但问题仍然存在。我使用调试选项在不同的端口上打开了一个新的 ssh 守护进程。此链接显示位于 pastebin.com/6252TuYy 的 sshd 日志。奇怪的是,除了尝试使用公钥之外,它没有显示任何失败*。但我正在使用密码和用户名。而这些词在它的日志中还不存在。在sshd_config中,允许root登录并允许密码登录...
    • 因此,在调试开启的情况下,您应该会看到您的服务器同时发布了允许的身份验证策略,并且干净地发布了可用的身份验证策略。通常大多数系统会尝试更好的策略,然后回退到其他不太理想的策略,密码将在列表的末尾附近。我假设您可以使用普通的 ssh 命令手动登录,因此服务器没有问题。很可能是您的客户端没有宣传它可以处理密码策略,或者您的服务器正在广播它不受支持。
    猜你喜欢
    • 1970-01-01
    • 2015-08-05
    • 2016-10-15
    • 2018-04-12
    • 2012-10-19
    • 1970-01-01
    • 2011-02-11
    • 2014-01-03
    • 1970-01-01
    相关资源
    最近更新 更多