一天中有好几次,我可能正在运行一个测试,我需要查看远程服务器上的日志文件。我已经习惯于使用我的终端来 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
我在 Mac OS X 10.8 中使用内置的 Terminal
。谢谢。
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}'
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
发出消息就会崩溃。但是,就可用性而言,开发人员领先了数年。
要上传单个文件,您需要创建一个 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 中工作。
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*).
--batch
需要我将命令放入文件中,然后将该文件作为参数传递。我还在玩scp
,我觉得它可能包含我的解决方案。
OpenSSH scp
supports SFTP protocol since 8.7。
由于 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
在 perl 和 system() 调用中使用它时,像下面这样的小修改对我有用:
sftp {user}@{host} <<< $'put {local_file_path} {remote_file_path}'
sftp {user}@{host}:{dir} <<< $'cd web\n put my_file.txt'