来自终端的单行sftp


91

全天几次,我可能正在运行一个测试,该测试需要浏览远程服务器上的日志文件。我已经习惯了使用终端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中内置的功能。谢谢。

Answers:


201

2017年9月更新-tl; dr

下载从远程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}'

20
我问过另一种方法(复制到远程服务器),但我自己找到了它:sftp {user} @ {host}:{dir} <<< $'put {文件路径}'
Thariama

2
抱歉,我误会了。我会将您的回答复制到答案中,以防将来对某人有所帮助。感谢@Thariama
Kyle

1
对于我们TL:DR -types而言,将错误的解决方案作为突出显示的第一行有点令人困惑:-)
skoll

1
@Kyle,好多了!
skoll

1
我觉得奇怪的是,sftp没有在单个命令中包含用于上载文件的选项。这很好用,但是对于这样一个简单的操作来说太过分了。这仍然是我能找到的唯一可以实际使用的东西,所以谢谢。:)
Teekin

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

但是,感谢您的答复,我在上面指出的答案将通过sftp使用单行命令从远程服务器获取文件并将文件保存到本地计算机上的特定位置。我已经验证了它只能在sftp的OS X上运行。
凯尔

2
是的,这无疑是从远程到本地传输的最佳答案。但是,尽管我会添加一个相反的解决方案:本地到远程。以防万一对任何人都有帮助。谢谢!
sstur 2014年

3

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

由于这是我每天在不同位置处理不同文件的过程,因此能够记住我可以在终端机中输入一行的命令(此命令始终处于打开状态)并按Enter会很高兴。使用--batch将需要我将命令放入文件中,然后将该文件作为参数传递。我仍然在玩scp,我觉得它可能包含我的解决方案。
凯尔(Kyle),

那时,您可能正在寻找“期望”。linuxjournal.com/article/3065
synthesizerpatel

3

echo 'put {path to file}' | sftp {user}@{host}:{dir},它将在unix和powershell中都起作用。


此语法也适用于puttyftp(psftp)。只是以为我会分享,因为这就是我最终来到这里的原因
9 Guy

1

从perl和system()调用中使用它时,如下所示的小修改对我有用:

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

1

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发出消息就会崩溃。但是,就可用性而言,开发人员要领先几年。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.