107

一天中有好几次,我可能正在运行一个测试,我需要查看远程服务器上的日志文件。我已经习惯使用我的终端sftp进入远程服务器并将所需的日志文件拉到/tmp我的本地机器上。

我正在查看今天使用的选项man sftp,试图找出一种基本上在一行中运行以下命令的方法,这样我就不必键入命令、按 enter、键入命令按 enter 等。

(我现在应该做什么)

sftp myuser@myserver
--mypassword at prompt
lcd /tmp
get /dir/dir/dir/dir/file
quit

我在查看我以前没有使用过man sftp的参考资料时发现。scp我觉得这可能是我正在寻找的东西,但我没有找到一种方法来指定我希望安全复制的文件去哪里。

有人可以为我提供一种/dir/file从远程服务器获取并将其下载到的方法/tmp/file_plus-my-description吗?

我希望能够运行类似于常规 UNIX 副本的 sftp 或 scp 命令,例如:

scp myuser@myserver /dir/file /tmp/file_plus-my-description

我正在使用内置的TerminalMac OS X 10.8。谢谢。

4

7 回答 7

236

2017 年 9 月更新 - tl;博士

从远程 ftp 服务器下载单个文件到您的机器:

sftp {user}@{host}:{remoteFileName} {localFileName}

将单个文件从您的机器上传到远程 ftp 服务器:

sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'

原答案:

好吧,所以我觉得有点笨。但我想通了。我几乎把它放在了顶部:

sftp user@host remoteFile localFile

终端中显示的唯一文档是:

sftp [user@]host[:file ...]
sftp [user@]host[:dir[/]]

但是,我遇到了这个网站,它在概要下显示了以下内容:

sftp [-vC1 ] [-b batchfile ] [-o ssh_option ] [-s subsystem | sftp_server ] [-B buffer_size ] [-F ssh_config ] [-P sftp_server path ] [-R num_requests ] [-S program ] host 
sftp [[user@]host[:file [file]]] 
sftp [[user@]host[:dir[/]]]

因此,简单的答案是您只需:在用户和主机之后执行远程文件和本地文件名即可。难以置信的简单!

单行,sftp 复制远程文件:

sftp username@hostname:remoteFileName localFileName
sftp kyle@kylesserver:/tmp/myLogFile.log /tmp/fileNameToUseLocally.log

2016 年 2 月更新

如果有人正在寻找与此相反的命令,并在一行命令中将文件从本地计算机sftp送到远程服务器, 下面的用户@Thariama 发布了解决方案来完成此操作。向他们提示额外代码。

sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'
于 2013-05-23T20:19:07.640 回答
9

SCP答案

OP提到了SCP,所以就是这样。

正如其他人指出的那样,SFTP 令人困惑,因为上传语法与下载语法完全不同。如果你使用相同的形式,它会容易记住:

echo 'put LOCALPATH REMOTEPATH' | sftp USER@HOST
echo 'get REMOTEPATH LOCALPATH' | sftp USER@HOST

实际上,这仍然是一团糟,这也是人们仍然使用“过时”命令(例如 SCP)的原因:

scp USER@HOST:REMOTEPATH LOCALPATH
scp LOCALPATH USER@HOST:REMOTEPATH

SCP 是安全的,但过时了。它有一些永远无法修复的错误,即如果服务器.bash_profile发出消息就会崩溃。但是,就可用性而言,开发人员领先了数年。

于 2020-11-04T11:04:12.173 回答
7

要上传单个文件,您需要创建一个 bash 脚本。sshpass如果您已安装,类似以下的内容应该可以在 OS X 上运行。

用法:

sftpx <password> <user@hostname> <localfile> <remotefile>

将此脚本放在路径中的某个位置并调用它sftpx

#!/bin/bash

export RND=`cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 32`
export TMPDIR=/tmp/$RND
export FILENAME=$(basename "$4")
export DSTDIR=$(dirname "$4")

mkdir $TMPDIR
cp "$3" $TMPDIR/$FILENAME

export SSHPASS=$1
sshpass -e sftp -oBatchMode=no -b - $2 << !
   lcd $TMPDIR
   cd $DSTDIR
   put $FILENAME
   bye
!

rm $TMPDIR/$FILENAME
rmdir $TMPDIR
于 2014-12-23T04:55:40.553 回答
4

或者 echo 'put {path to file}' | sftp {user}@{host}:{dir},它可以在 unix 和 powershell 中工作。

于 2019-11-09T00:26:20.847 回答
3

sftp supports batch files.

From the man page:

-b batchfile

Batch mode reads a series of commands from an input batchfile instead of stdin.  
Since it lacks user interaction it should be used in conjunction with non-interactive
authentication.  A batchfile of `-' may be used to indicate standard input.  sftp 
will abort if any of the following commands fail: get, put, rename, ln, rm, mkdir, 
chdir, ls, lchdir, chmod, chown, chgrp, lpwd, df, symlink, and lmkdir.  Termination 
on error can be suppressed on a command by command basis by prefixing the command 
with a `-' character (for example, -rm /tmp/blah*).
于 2013-05-23T19:08:51.500 回答
2

在 perl 和 system() 调用中使用它时,像下面这样的小修改对我有用:

sftp {user}@{host} <<< $'put {local_file_path} {remote_file_path}'
于 2020-06-09T12:36:49.347 回答
1

OpenSSH scp supports SFTP protocol since 8.7, via -s parameter.

Download:

scp -s user@host:/remote/source/path /local/target/path

Upload:

scp -s /local/source/path user@host:/remote/target/path

The future version of OpenSSH scp will use SFTP by default.

于 2021-08-08T13:15:14.943 回答