【问题标题】:Configuring SSH Agent Plugin for Jenkins on Windows在 Windows 上为 Jenkins 配置 SSH 代理插件
【发布时间】:2018-07-13 13:10:48
【问题描述】:

我正在尝试在 Jenkins (v2.103) 的 Windows 安装上配置 SSH 代理插件 (v1.15),以便能够通过 ssh 向远程计算机发出命令。

我已经安装了插件,并在 Jenkins Credentials(如下所示)中添加了一个条目,其中包含可以登录到远程计算机的私钥和密码(主机名:corp-wfdemo)。我已确认此密钥可用于验证运行 Jenkins 的用户。

我创建了一个 Pipeline 项目并添加了这个 Groovy 脚本来测试 ssh:

node ('ssh') {
    stage ('test') {
        sshagent(['corp-wfdemo']) {
            sh 'ls -la'
        }
    }
}

Jenkins master 的标签为ssh。这是安装了 Git Bash (MINGW64) 的 Windows Server 2012 机器。

当我尝试运行此作业时,尝试查找一些自动生成的 askpass.sh 脚本时会失败。这是输出:

有人可以帮忙吗?提前致谢!

此外,每次我尝试运行此作业时,都会生成一个 ssh-agent 的新实例,但不会终止,留下这个烂摊子:

【问题讨论】:

  • 1) 尝试从命令提示符手动运行命令一次,以清除身份验证点的错误。 2)在执行 ssh-ask 命令时,它是从临时路径不可用的 windows 文件夹执行的。

标签: windows jenkins sh jenkins-pipeline ssh-agent


【解决方案1】:

我已经使用 Git for Windows 很长时间了,但我一直在为同样的问题苦苦挣扎。在使用 github 或其他远程 ssh 存储库时,我希望能够打开多个窗口,但它们都共享同一个 ssh 代理。

下面是我称之为 Git Bash 的 assure_ssh_agent shell 函数的全部内容。在您运行的每个独立会话中获取其定义。我的~/.profile 中有以下两行。

. ~/ssh-agent.sh
assure_ssh_agent

定义函数后,您可以通过 ssh 添加您的密钥文件,或者,如果您在 .ssh/keylist 中定义它们的列表,您可以运行 addkeys,这会将它们全部加载到代理中 10 小时默认情况下,这应该足以满足正常工作日和长时间的午休时间。

工作原理:脚本在文件.ssh/pid_store 中维护共享状态。 如果assure_ssh_agent() 找不到有效的 pid,它将启动一个新代理,并将其 pid 和套接字写入那里,以供任何后续会话使用。


ssh-agent.sh的内容:

# echo $SSH_AUTH_SOCK $SSH_AGENT_PID

is_running() {
  (kill -0 ${1:?PID}) 2> /dev/null
}

agent_pid_store() {
  (
  pid_store=$HOME/.ssh/agent_pid
  touch -a $pid_store
  case $1 in
  ( read ) read pid sock < $pid_store && echo $pid $sock
      [ -n "$sock" ]
  ;;
  ( write) echo \
            ${SSH_AGENT_PID:?} \
            ${SSH_AUTH_SOCK:?} > $pid_store
  ;;
  ( clear ) rm -f ${pid_store:?}
  esac
  )
}

find_active_ssh_agent() {
  (
  set -- $(agent_pid_store read)
  pid=$1 sock=$2
  case $1 in
  ("") return 1
  ;;
  ($SSH_AGENT_PID)
     is_running $SSH_AGENT_PID && echo $SSH_AGENT_PID $2
  ;;
  (*)
     is_running $pid && echo $pid $sock && return
     return 1
  ;;
  esac
  )
}

ssh_agent_is_running() {
  (find_active_ssh_agent | read _was_there_something_to_read_)
}


assure_ssh_agent() {
  unset GIT_SSH
  unset SVN_SSH

  set -- $(
    find_active_ssh_agent
  ) && pid=$1 sock=$2

  :  "pid='$pid' sock='$sock'"
  :  "length: pid:${#pid} sock:${#sock}"

  case $pid$sock in
  ( "" )
    printf  "* " >& 2 
    eval $( ssh-agent ) > /dev/null
    agent_pid_store write
    echo "ssh agent ${SSH_AGENT_PID}" >& 2 
    return
  ;;
  ( * )
    export SSH_AGENT_PID=$pid SSH_AUTH_SOCK=$sock
    echo "ssh agent ${SSH_AGENT_PID}" >& 2 
    set +x
    return
  ;;
  esac
}

addkeys(){
  (set -e #-x
  unset GIT_SSH
  unset SVN_SSH
  Keyfile_Timeout=36000

  cd ~/.ssh 
  exec < keylist || 
    exit 1 $(echo >& 2 "Add names of keyfiles to $HOME/.ssh/keylist")
  while read keyfile
  do
    ssh-add -t ${Keyfile_Timeout} ~/.ssh/$keyfile
  done
  )
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多