Single line sftp from terminal

一天中,我可能会多次运行一个测试,在这个测试中,我需要查看远程服务器上的日志文件。我已经习惯了使用终端将 sftp连接到远程服务器,并将所需的日志文件下拉到本地机器上的 /tmp

我今天使用 man sftp浏览了一些选项,试图找到一种方法,基本上在一行中运行以下命令,这样我就不必键入命令,按回车键,按回车键,等等。

(我现在所做的)

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的方法?

我希望能够运行一个 sftp 或 scp 命令,类似于传统的 UNIX 副本,比如:

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

我使用的是 Mac OS X 10.8中内置的 Terminal,谢谢。

163591 次浏览

Sftp 支持批处理文件。

来自手册页:

-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*).

2017年9月更新

Download a single file from a remote ftp server to your machine:

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[/]]

然而,我偶然发现 this site的大纲如下:

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

Update Feb 2016

如果任何人正在寻找这个命令做相反的事情和 用力一个文件从您的本地计算机到一个远程服务器在一个单一的行 sftp命令,用户@Thariama 发布了解决方案,以实现这一点。给他们一个帽子提示。

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

要 UPLOAD 单个文件,需要创建 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

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

A minor modification like below worked for me when using it from within perl and system() call:

sftp {user}@{host} <<< $'put {local_file_path} {remote_file_path}'

SCP 回答

观察所提到了 SCP 就是这个。

As others have pointed out, SFTP is a confusing since the upload syntax is completely different from the download syntax. It gets 差不多 easier to remember if you use the same form:

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 是安全的,但过时了。它有一些永远无法修复的 bug,即当服务器的 .bash_profile发出一条消息时崩溃。然而,就可用性而言,开发人员还有很长的路要走。

OpenSSH.

OpenSSH 9.0以来,scp默认使用 SFTP。

在8.7到8.9中,必须通过 -s参数选择 SFTP。

下载:

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

上载:

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