Scp
批處理模式的 scp 要求
我正在從 Jenkins 伺服器(在 RHEL6 上)啟動一個腳本,除其他外,它使用帶有“BatchMode 是”的 SCP 從遠端機器複製文件。該腳本在 Jenkins 之外正常執行,但在內部失敗。詳細的 SCP 日誌顯示:
debug1: Next authentication method: publickey debug1: Offering public key: /var/lib/jenkins/.ssh/id_rsa debug1: Server accepts key: pkalg ssh-rsa blen 277 debug1: Trying private key: /var/lib/jenkins/.ssh/id_dsa
因此,登錄所需的 Jenkins 使用者缺少一些東西。它不是 known_hosts 條目,或者至少在 /var/lib/jenkins/.ssh/known_hosts 中列出了正確的主機。還能是什麼?
編輯:根據請求,命令是
scp -vvv -o "BatchMode yes" myuser@myserver.com:myfile.txt .
這是一個更廣泛的日誌片段:
Executing: program /usr/bin/ssh host myserver.com, user myuser, command scp -v -f myfile.txt OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013 debug1: Reading configuration data /etc/ssh/ssh_config debug1: Applying options for * debug2: ssh_connect: needpriv 0 debug1: Connecting to myserver.com [xxx.xxx.xxx.xxx] port 22. debug1: Connection established. debug1: identity file /var/lib/jenkins/.ssh/identity type -1 debug1: identity file /var/lib/jenkins/.ssh/identity-cert type -1 debug1: identity file /var/lib/jenkins/.ssh/id_rsa type 1 debug1: identity file /var/lib/jenkins/.ssh/id_rsa-cert type -1 debug1: identity file /var/lib/jenkins/.ssh/id_dsa type -1 debug1: identity file /var/lib/jenkins/.ssh/id_dsa-cert type -1 debug1: identity file /var/lib/jenkins/.ssh/id_ecdsa type -1 debug1: identity file /var/lib/jenkins/.ssh/id_ecdsa-cert type -1 debug1: Remote protocol version 2.0, remote software version OpenSSH_6.2 debug1: match: OpenSSH_6.2 pat OpenSSH* debug1: Enabling compatibility mode for protocol 2.0 debug1: Local version string SSH-2.0-OpenSSH_5.3 debug2: fd 3 setting O_NONBLOCK debug1: SSH2_MSG_KEXINIT sent debug3: Wrote 960 bytes for a total of 981 debug1: SSH2_MSG_KEXINIT received debug2: kex_parse_kexinit: diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 debug2: kex_parse_kexinit: ssh-rsa-cert-v01@openssh.com,ssh-dss-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com,ssh-dss-cert-v00@openssh.com,ssh-rsa,ssh-dss debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96 debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96 debug2: kex_parse_kexinit: none,zlib@openssh.com,zlib debug2: kex_parse_kexinit: none,zlib@openssh.com,zlib debug2: kex_parse_kexinit: debug2: kex_parse_kexinit: debug2: kex_parse_kexinit: first_kex_follows 0 debug2: kex_parse_kexinit: reserved 0 debug2: kex_parse_kexinit: ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 debug2: kex_parse_kexinit: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256 debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se debug2: kex_parse_kexinit: hmac-md5-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-ripemd160-etm@openssh.com,hmac-sha1-96-etm@openssh.com,hmac-md5-96-etm@openssh.com,hmac-md5,hmac-sha1,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96 debug2: kex_parse_kexinit: hmac-md5-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-ripemd160-etm@openssh.com,hmac-sha1-96-etm@openssh.com,hmac-md5-96-etm@openssh.com,hmac-md5,hmac-sha1,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96 debug2: kex_parse_kexinit: none,zlib@openssh.com debug2: kex_parse_kexinit: none,zlib@openssh.com debug2: kex_parse_kexinit: debug2: kex_parse_kexinit: debug2: kex_parse_kexinit: first_kex_follows 0 debug2: kex_parse_kexinit: reserved 0 debug2: mac_setup: found hmac-md5 debug1: kex: server->client aes128-ctr hmac-md5 none debug2: mac_setup: found hmac-md5 debug1: kex: client->server aes128-ctr hmac-md5 none debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP debug3: Wrote 24 bytes for a total of 1005 debug2: dh_gen_key: priv key bits set: 131/256 debug2: bits set: 773/1536 debug1: SSH2_MSG_KEX_DH_GEX_INIT sent debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY debug3: Wrote 208 bytes for a total of 1213 debug3: check_host_in_hostfile: host myserver.com filename /var/lib/jenkins/.ssh/known_hosts debug3: check_host_in_hostfile: host myserver.com filename /var/lib/jenkins/.ssh/known_hosts debug3: check_host_in_hostfile: match line 2 debug3: check_host_in_hostfile: host xxx.xxx.xxx.xxx filename /var/lib/jenkins/.ssh/known_hosts debug3: check_host_in_hostfile: host xxx.xxx.xxx.xxx filename /var/lib/jenkins/.ssh/known_hosts debug3: check_host_in_hostfile: match line 3 debug1: Host 'myserver.com' is known and matches the RSA host key. debug1: Found key in /var/lib/jenkins/.ssh/known_hosts:2 debug2: bits set: 759/1536 debug1: ssh_rsa_verify: signature correct debug2: kex_derive_keys debug2: set_newkeys: mode 1 debug1: SSH2_MSG_NEWKEYS sent debug1: expecting SSH2_MSG_NEWKEYS debug3: Wrote 16 bytes for a total of 1229 debug2: set_newkeys: mode 0 debug1: SSH2_MSG_NEWKEYS received debug1: SSH2_MSG_SERVICE_REQUEST sent debug3: Wrote 48 bytes for a total of 1277 debug2: service_accept: ssh-userauth debug1: SSH2_MSG_SERVICE_ACCEPT received debug2: key: /var/lib/jenkins/.ssh/identity ((nil)) debug2: key: /var/lib/jenkins/.ssh/id_rsa (0x7f38a83ee310) debug2: key: /var/lib/jenkins/.ssh/id_dsa ((nil)) debug2: key: /var/lib/jenkins/.ssh/id_ecdsa ((nil)) debug3: Wrote 64 bytes for a total of 1341 debug1: Authentications that can continue: publickey,keyboard-interactive debug3: start over, passed a different list publickey,keyboard-interactive debug3: preferred gssapi-keyex,gssapi-with-mic,publickey debug3: authmethod_lookup publickey debug3: remaining preferred: ,gssapi-with-mic,publickey debug3: authmethod_is_enabled publickey debug1: Next authentication method: publickey debug1: Trying private key: /var/lib/jenkins/.ssh/identity debug3: no such identity: /var/lib/jenkins/.ssh/identity debug1: Offering public key: /var/lib/jenkins/.ssh/id_rsa debug3: send_pubkey_test debug2: we sent a publickey packet, wait for reply debug3: Wrote 368 bytes for a total of 1709 debug1: Server accepts key: pkalg ssh-rsa blen 277 debug2: input_userauth_pk_ok: SHA1 fp 72:a5:45:d3:f2:6d:15:c4:2e:f9:37:34:44:10:2b:b9:59:ee:18:c0 debug3: sign_and_send_pubkey: RSA 72:a5:45:d3:f2:6d:15:c4:2e:f9:37:34:44:10:2b:b9:59:ee:18:c0 debug1: Trying private key: /var/lib/jenkins/.ssh/id_dsa debug3: no such identity: /var/lib/jenkins/.ssh/id_dsa debug1: Trying private key: /var/lib/jenkins/.ssh/id_ecdsa debug3: no such identity: /var/lib/jenkins/.ssh/id_ecdsa debug2: we did not send a packet, disable method debug1: No more authentication methods to try. Permission denied (publickey,keyboard-interactive).
過了一會兒,我意識到我自己創建了密鑰,只用“sudo ssh-keygen”。這意味著密鑰實際上屬於 root 使用者,而 jenkins 使用者沒有讀取它的權限。如果 ssh 告訴我這個,沒問題。但是,顯然,如果 ssh 無法讀取密鑰,它首先要做的就是要求輸入密碼。但由於它是在批處理模式下執行的,它無法要求輸入密碼,所以它就放棄了,密鑰失敗了。在我將密鑰文件分配給 jenkins 使用者之後,它一切正常。
這是日誌中告訴您發生了什麼的位:
debug1: Trying private key: /var/lib/jenkins/.ssh/identity debug3: no such identity: /var/lib/jenkins/.ssh/identity debug1: Offering public key: /var/lib/jenkins/.ssh/id_rsa debug3: send_pubkey_test debug2: we sent a publickey packet, wait for reply debug3: Wrote 368 bytes for a total of 1709 debug1: Server accepts key: pkalg ssh-rsa blen 277 debug2: input_userauth_pk_ok: SHA1 fp 72:a5:45:d3:f2:6d:15:c4:2e:f9:37:34:44:10:2b:b9:59:ee:18:c0 debug3: sign_and_send_pubkey: RSA 72:a5:45:d3:f2:6d:15:c4:2e:f9:37:34:44:10:2b:b9:59:ee:18:c0 debug1: Trying private key: /var/lib/jenkins/.ssh/id_dsa debug3: no such identity: /var/lib/jenkins/.ssh/id_dsa debug1: Trying private key: /var/lib/jenkins/.ssh/id_ecdsa debug3: no such identity: /var/lib/jenkins/.ssh/id_ecdsa debug2: we did not send a packet, disable method debug1: No more authentication methods to try. Permission denied (publickey,keyboard-interactive).
我看到這裡發生了一些不好的事情。
首先是它
/var/lib/jenkins/.ssh/id_rsa
作為公鑰提供,而這應該是私鑰。查看您的 sshd 配置文件可能會有所啟發。接下來它會尋找私鑰,但在以下任何地方都找不到它們:
/var/lib/jenkins/.ssh/id_dsa /var/lib/jenkins/.ssh/id_ecdsa
這很奇怪,因為在日誌文件的早些時候它聲稱這些文件存在:
debug1: identity file /var/lib/jenkins/.ssh/identity type -1 debug1: identity file /var/lib/jenkins/.ssh/identity-cert type -1 debug1: identity file /var/lib/jenkins/.ssh/id_rsa type 1 debug1: identity file /var/lib/jenkins/.ssh/id_rsa-cert type -1 debug1: identity file /var/lib/jenkins/.ssh/id_dsa type -1 debug1: identity file /var/lib/jenkins/.ssh/id_dsa-cert type -1 debug1: identity file /var/lib/jenkins/.ssh/id_ecdsa type -1 debug1: identity file /var/lib/jenkins/.ssh/id_ecdsa-cert type -1
以下是我會嘗試的事情:
chmod go-rwx /var/lib/jenkins/.ssh/*
這將確保只有使用者對密鑰文件具有讀取權限。這很重要,因為 OpenSSH 如果配置為安全的,將拒絕使用公開可讀的密鑰文件。- 密鑰文件是否使用密碼創建?受密碼保護的密鑰文件對自動化不起作用,因此請確保密鑰文件不受密碼保護。
- 密鑰文件是否安裝在 myserver.com 中
/home/myuser/.ssh/authorized_keys
,並且您是否chmod go-rwx /home/myuser/.ssh/*
在 myserver.com 上執行?