scp -i /Downloads/class4.pem/ ec2-user@hostip: /home/ec2-user/test
我正在尝试将文件从本地 mac 上传到 ec 2,我做错了什么?
答案1
与几乎所有涉及复制或移动文件的 unix 工具一样,应指定源文件前目的地。而且,除非您使用 scp 的
-r
选项递归复制整个目录树,否则您还需要指定一个实际的文件名(或与一个或多个文件名匹配的 glob 模式)作为源。目标可以是单个完整文件名或目录(当复制多个文件或递归目录树时,应该是一个目录)。
scp
当给定源或目标时,默认为用户的主目录user@host:
(或者host:
当本地用户名与远程用户名相同时,或者用户名由中的规则提供~/.ssh/config
)身份文件(即私钥)是文件,不是目录,所以
/Downloads/class4.pem
应该不是有一个尾随/
.另请注意,身份文件不能被其他人访问 - 即它应该由正在运行的用户拥有scp
,并且应该只能由该用户读取(例如权限 600 或 400)。
您的命令:
scp -i /Downloads/class4.pem ec2-user@hostip: /home/ec2-user/test
正在尝试复制从 ec2-user@hostip:
到 /home/ec2-user/test
。
这将失败并显示错误消息,例如scp: .: not a regular file
因为ec2-user@hostip:
没有指定实际文件并且您没有使用该-r
选项。
如果您想将本地文件复制/home/ec2-user/test
到 ec2-user 上的主目录hostip
,请尝试以下操作:
scp -i /Downloads/class4.pem /home/ec2-user/test ec2-user@hostip:
如果test
是目录而不是文件,并且您想要将整个目录复制到~ec2-user/test/
in hostip
,请使用-r
:
scp -i /Downloads/class4.pem -r /home/ec2-user/test/ ec2-user@hostip:
或者仅将本地目录顶层的文件复制/home/ec2-user/test/
到 hostip 上的远程用户ec2-user
的主目录中:
scp -i /Downloads/class4.pem /home/ec2-user/test/* ec2-user@hostip:
请注意,如果 test/ 存在任何子目录,这将生成错误消息(因为它们将与*
glob 匹配,但您尚未使用-r
)。
顺便说一句,虽然没有严格要求,但最好总是/
在目录中有尾随。它可以防止灾难性的错误,特别是对于旧版本的实用程序,这些实用程序没有提供内置保护,可以防止意外地mv
将数百个文件复制到一个文件中(除了最后一个移动的文件之外的所有文件都消失了!)。如果目标不是目录,则尾随 / 将导致 mv 失败。大多数现代版本的工具都会检测并防止此类错误,除非您不遗余力地覆盖该行为并强迫它们不要这样做。
尾随的 / 也是自记录的,很明显您想要复制到目录或从目录复制,而不仅仅是单个文件。
(*) 也有例外,但它们通常是覆盖常见做法的特定选项(即源在目标之前),并允许您将目标目录放在所有源文件之前。
例如,-t, --target-directory=DIRECTORY
GNU 版本中的选项cp
、mv
、等。这主要是为了方便起见,使这些程序更容易与其他程序(例如或 )ln
一起使用(将源文件名列表添加到命令末尾比插入它们更容易在中间)。find ... -exec ...
xargs