如何从仅可通过B访问的私有服务器A向Amazon S3传输文件?
解决从私有网络服务器A直接传输文件到Amazon S3的问题
我明白你遇到的困扰了——当你尝试指定具体文件名时,aws s3 cp 会误以为你要读取本地服务器B上的文件,而不是从管道接收来自服务器A的文件内容,所以才会抛出“The user-provided path file does not exist”的错误。下面给你几个可行的解决方案:
方案1:通过管道传输并指定S3目标文件名
如果你想保留直接传输的方式(文件不落地到服务器B),可以继续用管道配合进程替换,核心是让aws s3 cp从标准输入读取内容,同时显式指定S3上的目标文件名。命令格式如下:
scp -i key.pem user@serverA:/path/to/source_file | aws s3 cp - s3://your-bucket/path/target_file
这里的-是关键,它告诉aws s3 cp从标准输入读取数据,你只需要在S3路径后直接填写想要的文件名(比如target_file),就能把服务器A上的source_file准确传到S3的指定位置。
方案2:先同步到服务器B,再上传到S3
如果文件体积不大,或者需要在服务器B保留一份备份,可以分两步操作:
# 第一步:从服务器A复制文件到服务器B本地 scp -i key.pem user@serverA:/path/to/source_file /local/path/on/serverB/ # 第二步:从服务器B上传文件到S3 aws s3 cp /local/path/on/serverB/source_file s3://your-bucket/path/target_file
方案3:通过SSH直接读取服务器A文件内容并上传
另一种灵活的方式是用SSH命令直接在服务器A上读取文件内容,再通过管道传给aws s3 cp,效果和scp传输一致:
ssh -i key.pem user@serverA "cat /path/to/source_file" | aws s3 cp - s3://your-bucket/path/target_file
这条命令会通过SSH连接到服务器A,执行cat命令读取文件内容,然后将内容通过管道传给服务器B上的aws s3 cp,同样靠-让它从标准输入接收数据。
为什么原来的命令只在文件名是“-”时生效?
当你用scp ... >(aws s3 cp - s3://...)时,-作为aws s3 cp的源参数,代表从标准输入读取数据,而scp会把远程文件的内容输出到管道中,两者匹配就能正常工作。但如果你把-换成具体文件名,aws s3 cp会去服务器B的本地文件系统查找该文件,自然找不到,也就触发了报错。
内容的提问来源于stack exchange,提问作者AATHITH RAJENDRAN
相关产品推荐
相关产品推荐

