當 SSH 接受時,為什麼 SCP 不接受使用者名/主機名組合?
我曾經
ssh
通過 CyberArk 登錄 Linux 主機,這就是使用者名/主機名組合的原因:DB6164@DB6164CP#example.net@y96553.example.net#22@PsmpDblanVip.example.net
以下
ssh
命令有效:$ /usr/bin/ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no DB6164@DB6164CP#example.net@y96553.example.net#22@PsmpDblanVip.example.net
但是,以下
scp
命令失敗:$ /usr/bin/scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no DB6164@DB6164CP#example.net@y96553.example.net#22@PsmpDblanVip.example.net:/tmp/file.txt file.txt DB6164@DB6164CP#example.net@y96553.example.net#22: invalid user name
如果我刪除主機名中的“#”,則
scp
停止抱怨,但 CyberArk 失敗。我也嘗試過使用
scp
’s URI form:scp://[user@]host[:port][/path]
:$ /usr/bin/scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no scp://DB6164@DB6164CP#example.net@y96553.d.net#22@PsmpDblanVip.danskenet.net/tmp/file.txt file.txt scp://DB6164@DB6164CP#example.net@y96553.d.net#22@PsmpDblanVip.danskenet.net/tmp/file.txt file.txt: invalid uri
但這也失敗了。
為什麼會
scp
失敗,何時ssh
成功,以及如何使上述scp
命令起作用?更新:我需要為幾台主機(通過 CyberArk 連接)執行上述操作。
scp -o User='foo@bar@baz#quux' host:/rpath lpath scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no \ -o User='DB6164@DB6164CP#example.net@y96553.example.net#22' \ PsmpDblanVip.example.net:/tmp/file.txt file.txt
使用實用的解決方案繞過您提出的問題,您可以為此目標設置預設映射,這將簡化所有
ssh
傳輸用途。我
DB6164@DB6164CP#example.net@y96553.example.net#22@PsmpDblanVip.example.net
分成使用者DB6164@DB6164CP#example.net@y96553.example.net#22
和 CyberArk 代理PsmpDblanVip.example.net
,最終目標主機為DB6164CP
. 如果不正確,請相應地調整下面的範例。編輯(或創建)文件
~/.ssh/config
,並在文件末尾添加以下內容:######################################################################## # CyberArk proxy # Host DB6164CP UserKnownHostsFile /dev/null StrictHostKeyChecking no Hostname PsmpDblanVip.example.net User DB6164@DB6164CP#example.net@y96553.example.net#22 ######################################################################## # Default # Host * ForwardX11 yes ForwardX11Trusted yes Compression yes ServerAliveInterval 60
您可能需要調整預設主機的設置,因為這些設置將用於之前未明確定義和匹配的每個連接。(匹配的第一
Host
部分是使用的部分。)有了這個配置,你可以簡單地引用你的目標
DB6164CP
:ssh -n DB6164CP id scp -p /etc/hosts DB6164CP:/tmp/my_hosts
您可以向條目添加額外的主機名和模式
Host
,因此如果您有多個目標通過同一個代理主機,您可以定義這個Host DB6164CP OTHER* UserKnownHostsFile /dev/null StrictHostKeyChecking no Hostname PsmpDblanVip.example.net User %r@%h#example.net@y96553.example.net#22
並像這樣引用目標
ssh DB6164@DB6164CP ssh someOtherUser@OTHERhost1 # Or: ssh -l someOtherUser OTHERhost1 scp DB6164@DB6164CP:file.txt . # Or: scp -l DB6164 DB6164CP:file.txt
您可以根據需要使用
%r
和%h
- 如果您始終擁有固定的使用者名但主機可變,請使用固定字元串代替%r
(對於您的原始問題場景)