来自终端的单线sftp

Kyl*_*yle 68 unix terminal sftp scp

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

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

(我现在应该做什么)

sftp myuser@myserver
--mypassword at prompt
lcd /tmp
get /dir/dir/dir/dir/file
quit
Run Code Online (Sandbox Code Playgroud)

我在查看之前未使用过man sftp的参考资料时发现了scp.我觉得这可能是我正在寻找的,但我没有看到一种方法来指定我想要安全复制文件的位置.

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

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

scp myuser@myserver /dir/file /tmp/file_plus-my-description
Run Code Online (Sandbox Code Playgroud)

我正在使用TerminalMac OS X 10.8中的内置功能.谢谢.

Kyl*_*yle 163

2017年9月更新 - tl;博士

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

sftp {user}@{host}:{remoteFileName} {localFileName}
Run Code Online (Sandbox Code Playgroud)

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

sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'
Run Code Online (Sandbox Code Playgroud)

原始答案:

好的,所以我觉得有点愚蠢.但我明白了.我几乎把它放在顶部:

sftp user@host remoteFile localFile
Run Code Online (Sandbox Code Playgroud)

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

sftp [user@]host[:file ...]
sftp [user@]host[:dir[/]]
Run Code Online (Sandbox Code Playgroud)

但是,我发现这个网站在概要中显示了以下内容:

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[/]]]
Run Code Online (Sandbox Code Playgroud)

所以简单的答案是你只需要:在用户和主机后执行远程文件和本地文件名.非常简单!

单行,sftp复制远程文件:

sftp username@hostname:remoteFileName localFileName
sftp kyle@kylesserver:/tmp/myLogFile.log /tmp/fileNameToUseLocally.log
Run Code Online (Sandbox Code Playgroud)

2016年2月更新

如果有人正在寻找相反的命令,并在一个单行 命令中将文件从本地计算机送到远程服务器,sftp下面的用户@Thariama发布了解决方案来实现这一点.帽子给他们提示额外的代码.

sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'
Run Code Online (Sandbox Code Playgroud)

  • 我反过来问(复制到远程服务器),但我自己找到了:_sftp {user} @ {host}:{dir} <<< $'put {path to file}'_ (16认同)
  • 道歉,误解了.我会将您的回复复制到答案中,以防将来可以帮助某人.谢谢@Thariama (2认同)

c z*_*c z 14

SCP答案

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

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

echo 'put LOCALPATH REMOTEPATH' | sftp USER@HOST
echo 'get REMOTEPATH LOCALPATH' | sftp USER@HOST
Run Code Online (Sandbox Code Playgroud)

事实上,这仍然是一团糟,这就是为什么人们仍然使用“过时”的命令,例如 SCP:

scp USER@HOST:REMOTEPATH LOCALPATH
scp LOCALPATH USER@HOST:REMOTEPATH
Run Code Online (Sandbox Code Playgroud)

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


sst*_*tur 7

要上传单个文件,您需要创建一个bash脚本.如果已sshpass安装,则类似以下内容应适用于OS X.

用法:

sftpx <password> <user@hostname> <localfile> <remotefile>
Run Code Online (Sandbox Code Playgroud)

将此脚本放在路径中的某个位置并调用它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
Run Code Online (Sandbox Code Playgroud)

  • 是的,这肯定是从远程转移到本地的最佳答案.然而,我虽然添加了相反的解决方案:本地到远程.以防它对任何人都有帮助.谢谢! (2认同)

js2*_*010 5

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


Mar*_*ryl 5

OpenSSHscp 从 8.7 开始支持 SFTP 协议

OpenSSH 9.0scp开始,默认使用 SFTP 。

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

下载:

scp -s user@host:/remote/source/path /local/target/path
Run Code Online (Sandbox Code Playgroud)

上传:

scp -s /local/source/path user@host:/remote/target/path
Run Code Online (Sandbox Code Playgroud)