来自终端的单线sftp

时间:2013-05-23 19:02:08

标签: unix terminal sftp scp

全天多次,我可能正在运行测试,我需要查看远程服务器上的日志文件。我已经习惯使用我的终端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的方法吗?

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

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

我在Mac OS X 10.8中使用内置的Terminal。感谢。

7 个答案:

答案 0 :(得分:152)

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

但是,我遇到了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

2016年2月更新

如果有人正在查找命令以执行相反操作并且文件从本地计算机推送到远程服务器,只需一行sftp命令,用户@Thariama下面发布了解决方案来实现这一点。为他们额外的代码提示他们。

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

答案 1 :(得分:6)

要上传单个文件,您需要创建一个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

答案 2 :(得分: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*).

答案 3 :(得分:1)

tail,在Unix和Powershell中都可以使用。

答案 4 :(得分:1)

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

error:java.lang.ClassNotFoundException: org.geomesa.example.redis.RedisQuickStart

答案 5 :(得分:1)

SCP答案

OP提到了SCP,就是这样。

正如其他人指出的那样,SFTP令人困惑,因为 upload 语法与 download 语法完全不同。如果使用相同的格式,则边缘更容易记住:

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发出一条消息,则会导致崩溃。但是,在可用性方面,开发人员要领先几年。

答案 6 :(得分:0)

OpenSSH 的未来版本 scphttps://flutter.dev/docs/development/data-and-backend/json,通过 -M sftp 参数。

下载:

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

上传:

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