这可能是我问过的最荒谬的问题,但我坦率地承认我被难住了。我正试图将一些文件从远程服务器移动到我的本地计算机。显然,我正在运行 Ubuntu。现在,仅就背景而言,这台机器有两个不同的用户。我以其中一个用户的身份登录;joe。因此,当我单击 Unity 中的主文件夹时,我得到了我的 joe 主文件夹,其中包含我的所有子文件夹和文件。joe 中的文件夹之一称为 remote。remote 内还有另一个名为 mail 的文件夹。我使用 openssh 或 putty 登录远程服务器没有问题,但我无法将文件复制到 joe/remote/mail。由于某种原因,我一直弄错路径,我尝试了我能想到的所有变体。部分列表如下...
/joe/remote/mail
/remote/mail
~/joe/remote/mail
~/remote/mail
remote/mail
joe/remote/mail
/home/remote/mail
/home/joe/remote/mail
/local/home/joe/remote/mail
/local/joe/remote/mail
/local/remote/mail
你明白了。我尝试的所有方法都出现相同的错误:文件夹 xxxx 不存在。我想我在这里要问的是,openssh 和 putty 到底认为本地机器上的当前目录是什么?我搜索了在线文档,没有找到任何可以告诉我这个简单且无限有用的信息。
另外,我继续使用“。”作为目标来复制文件,这应该会将它们复制到本地计算机上的当前目录中。成功了!但是……它们在哪里?它们不在根目录中。它们不在 Home 中。它们不在 joe 中。我迷路了。
编辑以添加我正在使用 scp 来复制文件(如果重要的话)。
答案1
SSH 会话中的大部分混乱可能源于我们必须始终意识到三位置来获取正确的命令。
在下文中,我将 称为@home
我们实际坐落的地方,并将其称为@remote
我们通过 SSH 连接的机器。一旦我们在远程机器上打开 SSH 会话,终端就会在远程机器上执行以下所有命令。这可以通过提示符直观地看到:
admin@home:~$
:我们坐在我们的家机器的 HOME 目录中user@remote:~S
:我们以用户身份登录到他的主页上偏僻的机器
我们想要的是:
如果我们想复制文件从遥控器到我们的家我们必须知道我们坐在哪里,即在哪台机器上执行命令:
admin@home:~$ scp user@remote:/remote_path/source.file /home_path/
scp
将在我们的主机器上执行命令,将远程机器上source.file
的复制到我们的主机器上。remote_path
home_path
我们可能不想要的
如果我们执行以下操作:
admin@home:~$ ssh user@remote
user@remote:~$ scp user@remote:/remote_path/source.file /home_path/
这与我们预期的并不完全一致,因为在远程机器上执行 scp 来source.file
将/home_path
在远程机器上。为了明确来源和目的地,我们将发布
user@remote:~$ scp user@remote:/remote_path/source.file admin@home:/home_path/
然后source.file
确实会被复制到home_path
但只有当远程机器(执行 scp 的地方)可以打开到我们主机器的 SSH 会话时才可以。
我们可以进一步扩展 scp 的用法,将文件从一台remote1
机器复制到另一台remote2
机器,方法如下:
admin@home:~$ scp user1@remote1:/remote1_path/source.file user2@remote2:/remote2_path/
使用 rsync 进行高级复制
由于 scp 有一些限制,我们可能想要使用同步来复制文件。下面是调用此方法的示例:
admin@home:~$ rsync -avze ssh user@remote:/path/source_dir/ /path/destination_dir
这会将所有文件从远程克隆source_dir
到destination_dir
我们的家用机器上。
答案2
命令scp
行原则上如下所示:
scp options from to
暂时忽略这些选项(无论如何它们都是可选的);您可以使用 阅读它们man scp
。
scp 支持本地和远程文件名from
。to
本地文件名只是常规文件或目录名,例如:
/home/joe/
/home/joe/remote/mail
/home/joe/remote/mail/inbox
远程文件名由两部分或三部分组成:
- (可选)用户名
- 远程主机名
- 远程主机上的路径
远程文件名由以下部分构成,如下所示
remote-host:/path/on/remote/host
user@remote-host:/path/on/remote/host
如果您想要将本地目录“/home/joe/remote/mail”中的所有文件复制到第二台服务器“other”上的目录“/opt/backup/joe/mail”,使用用户名“admin”,请发出以下命令:
scp -r /home/joe/remote/mail admin@other:/opt/backup/joe/mail
(-r
意思是递归复制目录)
如果您想要使用用户名“admin”将远程服务器“other”中的“/var/spool/mail/joe/”下的所有文件复制到本地文件夹“/home/joe/remote/mail”中,请发出以下命令:
scp -r admin@other:/var/spool/mail/joe/ /home/joe/remote/mail
答案3
openssh 默认为相关用户的主目录。
尝试使用sudo updatedb
后跟locate filename
来定位任何文件。
答案4
使用 scp,您需要给出远程机器名称,例如:
scp /path/to/file-to-copy joe@hostname:/home/joe/remote/mail/
假设您通过 SSH 登录到远程计算机并想要复制到本地计算机上的 joe 用户。hostname
是您的本地计算机的名称(也可以是 IP,但在两种情况下,都必须可以从远程计算机访问)。
您也可以反转这种情况(例如,使用 VPS,您的本地计算机可能无法访问)并从本地计算机执行以下操作:
scp login@remote-machine:/path/to/file/to/copy ~joe/remote/mail/
OBS:当您通过 SSH 连接到一台机器时,终端位于远程机器上,并且“不知道”您的本地机器是什么,如果没有主机名就无法访问它。此外,您还需要有一条从远程机器访问本地机器的路由(您可以尝试使用ping
本地机器)。
当您将文件复制到“。”时,它们会被复制到您当时在远程计算机上的目录中。
更新:
主机名仅仅是机器名或带有域名的机器名,如machinename.domain.com,但这仅当您可以从远程机器访问本地机器时才有效(如果远程是通过互联网或某种本地名称解析(例如DNS)则您的本地机器具有公共IP(和DNS记录)如果两台机器都在同一个网络上)。
如果您的机器没有名称解析系统但机器位于同一网络中或您使用的是公共 IP,则主机名也可以是 IP。
由于您无法从远程机器 ping 通您的机器,我认为您没有配置任何方式来访问它,您应该使用上面提出的反向解决方案,不执行 SSH 到远程机器,而是从您的机器使用 SCP 复制,因为您的远程机器是可访问的(您可以通过 SSH 进入它)。
解释一下语法:user@something 是机器的登录名,something 必须是主机名而不是目录。因此 joe@home/... 无法访问任何内容,因为 home 是目录,而您无法登录目录。