【问题标题】:'scp' is not recognized as an internal or external command while executing Jenkins file执行 Jenkins 文件时,'scp' 未被识别为内部或外部命令
【发布时间】:2019-08-08 17:25:53
【问题描述】:

我有一个非常基本的Jenkins pipeline,它构建了一个Java 项目并将工件部署到EC2 实例。

构建部分工作正常,但部署不工作,并给出与scp 相关的错误。

我将Jenkinsfile 中存在的整个scp 命令复制粘贴到Windows 命令提示符上,以查看它是否有效并将jar 复制到ec2 实例成功,它确实有效。

不知道为什么它不能通过Jenkins 工作。

Jenkinsfile

pipeline {
        agent any
        tools {
            maven "Maven3"
        }
        stages {
            stage('Build and Deploy') {
                steps {
                    script {
                        def os = System.properties['os.name'].toLowerCase()
                        echo "OS: ${os}"                
                        if (os.contains("linux")) {
                          sh "mvn clean install -DskipTests" 
                        } else {
                          bat "mvn clean install -DskipTests"
                          bat "scp -i C:\\Users\\Nital\\.ssh\\LightsailDefaultKey-us-east-1.pem target\\helloworld-rest-app.jar ec2-user@35.175.125.176:/home/ec2-user/app-deploys"
                        }
                    }
                }
                post {
                    success {
                        echo 'Build and Deploy - SUCCESS'
                    }
                } 
            }
        }
    }

Windows 命令提示符:

C:\Users\Nital>scp
usage: scp [-346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
           [-l limit] [-o ssh_option] [-P port] [-S program] source ... target

Jenkins 错误日志:

[INFO] Installing C:\Program Files (x86)\Jenkins\workspace\helloworld-rest-app-build\pom.xml to C:\Windows\system32\config\systemprofile\.m2\repository\com\example\helloworld-rest-app\0.0.1-SNAPSHOT\helloworld-rest-app-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.991 s
[INFO] Finished at: 2019-01-25T00:11:10-05:00
[INFO] ------------------------------------------------------------------------
[Pipeline] bat

C:\Program Files (x86)\Jenkins\workspace\helloworld-rest-app-build>scp -i C:\Users\Nital\.ssh\LightsailDefaultKey-us-east-1.pem target\hellworld-rest-app.jar ec2-user@35.175.125.176:/home/ec2-user/app-deploys 
'scp' is not recognized as an internal or external command,
operable program or batch file.
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE

【问题讨论】:

  • 听起来 scp 不在运行 Jenkins 的用户路径中
  • Jenkins 位于同一台本地计算机上,即Windows 10。我用截图更新了我的原始问题,显示我可以使用SCP手动将JAR复制到EC2
  • Jenkins 是否使用您的用户 ID 运行? scp 是如何添加到 shell 的 PATH 环境中的?
  • 我刚刚看到它scp 是从 `C:\Windows\System32\OpenSSH' 中挑选出来的,我认为它可以与其他程序一起安装。我也将此文件夹添加到 PATH 变量中,然后刚刚再次运行构建作业,但没有运气。为什么 Jenkins 不能选择这个 scp.exe 而 Windows 命令提示符可以? Jenkins 中是否还有任何配置需要完成?
  • 是的,Jenkins 使用相同的用户 ID 运行,并且安装在同一台 Windows 10 机器上。

标签: amazon-web-services jenkins amazon-ec2 ssh jenkins-pipeline


【解决方案1】:

这是因为可执行文件位于 Windows System32 目录中,并且出于安全考虑,无法从脚本访问。如果您将 sshscp 可执行文件从 windows 目录中复制出来,并将新目录放入您的路径中,它应该可以工作。

【讨论】:

    【解决方案2】:

    如果你需要 scp 来自 Windows 的东西,那么为什么不简单地使用 pscp 来实现呢?

    安装 PuTTY,其中还包括 PSCP(适用于 Windows 的 SCP)。

    http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

    请为您的计算机(32 位或 64 位)选择最新版本的 MSI(“Windows Installer”)

    如果你想在 Java 程序中使用它,那么这里是一个例子:http://www.jcraft.com/jsch/examples/ScpFrom.java.html

    【讨论】:

    • 如果上述问题没有解决方案,我当然可以尝试。我无法理解为什么那个东西是通过命令提示符而不是通过同样安装在同一台机器上的 Jenkins 来工作的。
    • @user2325154 你能用scp的完整路径试试C:\Program Files\PuTTY\scp -i C:\Users\Nital\.ssh\LightsailDefaultKey-us-east-1.pem target\hellworld-rest-app.jar ec2-user@35.175.125.176:/home/ec2-user/app-deploys
    • 我在 C:\Program Files\PuTTY\ 文件夹中看不到任何 scp.exe,因此我认为上述命令会失败。
    • scp.exe 存在于 C:\Windows\System32\OpenSSH 文件夹中。我尝试添加完整路径并再次运行构建作业,但没有运气
    • 我在尝试安装 pscp 后收到此错误消息。 # pscp -i C:\Users\Nital\.ssh\LightsailDefaultKey-us-east-1.pem target\helloworld-rest-app.jar ec2-user@35.175.125.176:/home/ec2-user/app-deploys Unable to use key file "C:\Users\Nital\.ssh\LightsailDefaultKey-us-east-1.pem" (OpenSSH SSH-2 private key (old PEM format)) Fatal: Disconnected: No supported authentication methods available (server sent: publickey)
    【解决方案3】:

    在执行 scp 等任何命令之前添加此行。

    PATH=/sbin:/usr/sbin:/usr/bin:/usr/local/bin
    

    【讨论】:

    • 在 Jenkinsfile 中设置这个?我正在使用 Windows 操作系统,因此我将尝试与上述命令等效的 Windows
    【解决方案4】:

    用于在两台 Linux/Unix 计算机系统之间安全传输文件的 scp 命令

    scp 命令的语法是:

    scp [options] username1@source_host:directory1/filename1 username2@destination_host:directory2/filename2
    

    为了在 windows 中使用 scp 命令,请使用 pscp:

    pscp c:\documents\info.txt userid@server.example.com:/tmp/foo/info.txt
    

    请通过关节

    https://it.cornell.edu/managed-servers/transfer-files-using-putty

    【讨论】:

    • 我在安装 pscp 后收到此错误消息。 # pscp -i C:\Users\Nital\.ssh\LightsailDefaultKey-us-east-1.pem target\helloworld-rest-app.jar ec2-user@35.175.125.176:/home/ec2-user/app-deploys无法使用密钥文件“C:\Users\Nital\.ssh\LightsailDefaultKey-us-east-1.pem”(OpenSSH SSH-2 私钥(旧 PEM 格式))致命:断开连接:没有支持的身份验证方法(服务器发送:公钥)
    猜你喜欢
    • 2020-08-18
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2013-10-06
    • 2013-10-11
    • 2013-01-25
    • 2016-10-01
    相关资源
    最近更新 更多