1) 检查本地与跳板机的SSH连通:ssh user@bastion.example.com -p 22。
2) 确认跳板机能到目标内网主机:从跳板机ssh user@target.internal。若不能,先解决网络/路由问题。
3) 确认有可写目录(如/home/upload或/var/sftp/upload):如果没有,管理员在跳板机上创建并设置拥有者:sudo mkdir -p /home/upload && sudo chown jumpuser:jumpgroup /home/upload && sudo chmod 770 /home/upload。
1) scp命令(带密钥):scp -i ~/.ssh/id_rsa ./localfile.txt jumpuser@bastion.example.com:/home/upload/。
2) scp时指定端口:scp -P 2222 localfile jump@bastion:/path/。
3) 使用sftp交互式:sftp -i ~/.ssh/id_rsa jumpuser@bastion.example.com,然后put localfile /home/upload/localfile。适合大文件断点或手动管理。
1) 一步到位(OpenSSH 7.3+ ProxyJump):scp -o ProxyJump=jumpuser@bastion.example.com localfile targetuser@target.internal:/path/。
2) rsync示例(推荐断点续传/同步):rsync -avz -e "ssh -J jumpuser@bastion.example.com" ./localdir/ targetuser@target.internal:/remote/dir/。
3) 如果老版OpenSSH,使用ProxyCommand:scp -o "ProxyCommand ssh -W %h:%p jumpuser@bastion" localfile target@target:/path/。
1) scp -3 用法(本地作为中转):scp -3 user1@host1:/path/file user2@host2:/path/。注意两端需允许ssh连接且版本支持。
2) 若不能直接,先上传到跳板机再从跳板机传到目标:本地->跳板:scp localfile jump:/home/upload/,ssh jump 然后 scp /home/upload/localfile target:/dest/。
1) 私钥权限必须是600:chmod 600 ~/.ssh/id_rsa;.ssh目录700:chmod 700 ~/.ssh。authorized_keys 600。
2) 把公钥推到跳板机:ssh-copy-id -i ~/.ssh/id_rsa.pub jumpuser@bastion.example.com。若不能用ssh-copy-id,可手工echo >> ~/.ssh/authorized_keys。
3) 使用ssh-agent转发:eval "$(ssh-agent -s)"; ssh-add ~/.ssh/id_rsa;并在ssh时允许ForwardAgent(但注意安全风险)。
1) Permission denied (publickey):确认私钥权限600,公钥存在于目标用户~/.ssh/authorized_keys,服务器sshd_config允许PubkeyAuthentication yes。
2) Permission denied (publickey) / bad ownership:检查~/.ssh和home目录属主和权限,不当属主或过宽权限会导致拒绝,修复示例:sudo chown -R user:user /home/user && chmod 700 /home/user/.ssh && chmod 600 /home/user/.ssh/authorized_keys。
3) scp: Permission denied(写权限):确认目标目录权限与SELinux上下文(下一段)。若是临时解决,可把文件放到用户家目录,再由管理员移动。
1) SELinux检查:ls -Z /path/ 看上下文,若不对:sudo restorecon -Rv /path/。临时关闭(不推荐)sudo setenforce 0。
2) ACL问题:getfacl /path/ 查看,设置ACL示例:setfacl -m u:targetuser:rwx /path/。
3) 当使用Chroot SFTP(如/var/sftp)时,目录必须root:root且权限严格,上传目录需额外子目录给用户写入,例:/var/sftp/upload owned by root, /var/sftp/upload/userdir chown user。
1) 定期检查SSH登录日志(/var/log/auth.log或/var/log/secure)以发现失败原因;设置fail2ban防止暴力破解。
2) 用脚本同步公钥与user列表(配置管理如Ansible可批量下发authorized_keys),示例Ansible片段可保证权限与内容一致。
3) 对常用传输路径设置监控与容量报警,定期清理临时文件并限制上传大小与速率(rsync带--bwlimit)。
问:scp报“Permission denied”,我已经把私钥权限改为600,还是不行,如何快速定位?
答:先确认使用的是正确的私钥(ssh -v 登录看使用的key),确认跳板机目标用户的~/.ssh/authorized_keys 包含公钥且权限、属主正确;检查sshd_config是否禁用了Password或Pubkey;若是写权限被拒绝,检查目标目录属主和SELinux上下文并用restorecon修正,必要时查看/var/log/auth.log获取详细报错信息。
问:我在Windows上,如何把文件传到跳板机并通过跳板机传到内网主机?
答:推荐使用WinSCP或PuTTY/pscp。WinSCP可以配置“高级->连接->代理/Proxy”或使用Pageant加载私钥并设置“SSH代理”;若需ProxyJump,在Putty里配置跳板机作为ProxyCommand或先用pscp上传至跳板,再SSH到跳板用scp传到目标。注意将私钥转换为Ppk格式(PuTTYgen)。
问:文件传上去后属主变成root或权限不正确,如何快速修复并避免再次发生?
答:快速修复用chown/chmod:sudo chown targetuser:targetgroup /path/file && sudo chmod 644 /path/file。若是SFTP/Chroot导致属主问题,应检查上传流程(是否用sudo上传或用root账号),并为上传设计专用目录与上传脚本,或使用rsync --chown=USER:GROUP 同步后自动设置归属。
