Unix 来自终端的单线sftp

Unix 来自终端的单线sftp,unix,terminal,sftp,scp,Unix,Terminal,Sftp,Scp,一天中有好几次,我可能正在运行一个测试,需要查看远程服务器上的日志文件。我已经习惯了使用我的终端将sftp导入远程服务器,并将所需的日志文件向下拉到本地机器上的/tmp 我今天使用mansftp浏览了这些选项,试图找出一种基本上在一行中运行以下命令的方法,这样我就不必键入命令、按enter键、键入命令或按enter键等 (我现在做什么) 在查看man-sftp时,我发现了对scp的引用,这是我以前从未使用过的。我觉得这可能是我正在寻找的,但我没有找到一种方法来指定我希望安全复制的文件去哪里 有人

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

我今天使用
mansftp
浏览了这些选项,试图找出一种基本上在一行中运行以下命令的方法,这样我就不必键入命令、按enter键、键入命令或按enter键等

(我现在做什么)

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

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

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

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

我正在使用Mac OS X 10.8中内置的
终端。谢谢。

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月-tl;dr

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

sftp {user}@{host}:{remoteFileName} {localFileName}
将单个文件从计算机上载到远程ftp服务器:

sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'
终端中显示的唯一文档如下:

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
命令将文件从本地计算机推送到远程服务器,下面的user@Thariama发布了解决方案。向他们提示额外的代码

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

sftp{user}@{host}:{remote_dir}要上载单个文件,需要创建bash脚本。如果您已经安装了
sshpass
,那么在OSX上应该可以使用以下类似的功能

用法:

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

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

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

sftp{user}@{host}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\u profile
发出消息,它将崩溃。然而,就可用性而言,开发人员领先了几年。

由于这是一个我每天对不同位置的不同文件执行多次的过程,所以只要记住一条命令就好了,我可以在终端的一行中键入命令(该命令始终打开),然后按enter键。使用
--batch
需要我将命令放入一个文件中,然后作为参数传入该文件。我仍然在玩
scp
,我觉得它可能包含了我的解决方案。也许“expect”就是你想要的。感谢您的回复,但是,我上面提到的答案将使用带有sftp的单行命令从远程服务器获取文件,并将文件保存到本地计算机上的特定位置。我已经验证了它在OSX上只使用sftp就可以工作。是的,这无疑是从远程传输到本地的最佳解决方案。然而,我想我应该添加一个相反的解决方案:从本地到远程。以防对任何人都有帮助。谢谢我问的是另一种方式(复制到远程服务器),但我自己发现了:sftp{user}@{host}:{dir}对不起,误解了。我会把你的回答抄到答案里,以防将来对别人有所帮助。谢谢@ThariamaTo complete@Thariama answer,如果您想在上传文件之前移动到一个目录,请用“\n”分隔每个命令<代码>sftp{user}@{host}:{dir}对于我们TL:DR-types,将不正确的解决方案作为第一个突出显示的行有点混乱:-)@Kyle,更好!此语法也适用于puttyftp(psftp)。我只是想和大家分享一下,因为这就是我在这里结束的原因,一个关于超级用户的相关问题:。
#!/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 {user}@{host} <<< $'put {local_file_path} {remote_file_path}'
echo 'put LOCALPATH REMOTEPATH' | sftp USER@HOST
echo 'get REMOTEPATH LOCALPATH' | sftp USER@HOST
scp USER@HOST:REMOTEPATH LOCALPATH
scp LOCALPATH USER@HOST:REMOTEPATH