我正在尝试通过 ssh 将目录从远程服务器 (CentOS) 传输到我的本地计算机 (Ubuntu)。有两个用户:A 和 B。用户 A 可以 ssh 进入远程服务器并具有 sudo 访问权限。用户 B 拥有远程服务器中的目录。
要将用户 B 拥有的目录转移为用户 A,需要使用 sudo。
目前,为了传输文件(从远程到本地),我正在使用以下内容:
ssh -tt userA@remote_host 'stty raw -echo; sudo cat /path/to/remote/file/owned/by/userB' > /path/to/local/file
为了传输目录,我尝试了 tar 方法,
ssh -tt userA@remote_host 'stty raw -echo; sudo tar -C /path/to/remote/directory/owned/by/userB/ -czf - .' | tar -C /path/lo/local/directory -xzf -
但是在本地系统上我收到此错误:
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now
我究竟做错了什么?
答案1
尝试使用 ssh 传输目录
ssh -tt userA@remote_host 'stty raw -echo; sudo tar -C /path/to/remote/directory/owned/by/userB/ -czf - .' | tar -C /path/lo/local/directory -xzf -
将上述命令的输出通过管道传输到 cat (在本地系统中)而不是 tar,可以提供更多信息:
$ ssh -tt userA@remote_host 'stty raw -echo; sudo tar -C /path/to/remote/directory/owned/by/userB/ -czf - .' | cat
userA@remote_host's password:
gzip: compressed data not written to a terminal. Use -f to force compression.
For help, type: gzip -h
Connection to remote_host closed.
为了解决这个问题,我使用了以下命令:
ssh -t userA@remote_host 'stty raw -echo; sudo tar -C /path/to/remote/directory/owned/by/userB/ -cf - . | gzip -9nf' | tar -C /path/lo/local/directory -xzf -
ssh 选项注意事项
由于我正在使用它sudo
来访问用户 B 的目录,因此如果不使用选项则ssh
返回。sudo: sorry, you must have a tty to run sudo
-t
-t
:强制伪终端分配
stty 选项说明
该stty
选项是可选的。如果需要输入密码,则-echo
可以使用它(我认为) 。sudo
raw
:按原样处理输入(不解释特殊字符等)
-echo
:不打印输入的字符
gzip 选项注意事项
-9
:将压缩设置为最大
-f
:力压缩(根据错误提示)
-n
,--no-name
:不包含文件的名称和时间戳(有助于比较远程和本地文件的校验和)