ターミナルからの単一行sftp


92

1日に数回、リモートサーバー上のログファイルを調べる必要があるテストを実行している場合があります。ターミナルを使用sftpしてリモートサーバーにアクセスし、目的のログファイルを/tmpローカルマシンにプルダウンすることに慣れました。

man sftpコマンドを入力したり、Enterキーを押したり、Enterキーを押したりする必要がないように、基本的に1行で次のコマンドを実行する方法を見つけようとして、今日使用しているオプションを調べていました。

(私が今していること)

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

組み込みのTerminalMacOS X10.8を使用しています。ありがとう。

回答:


204

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月の更新

誰かがこれを逆にして、ローカルコンピューターからリモートサーバーにファイルを1行の コマンドでプッシュするコマンドを探している場合はsftp、以下のユーザー@Thariamaがそれを実現するためのソリューションを投稿しました。余分なコードのための彼らへの帽子のヒント。

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

20
私は逆の方法(リモートサーバーへのコピー)を求めていましたが、自分で見つけました:sftp {user} @ {host}:{dir} <<< $ 'put {path to file}'
Thariama 2016

2
誤解されて申し訳ありません。将来誰かを助けることができる場合に備えて、あなたの回答を回答にコピーします。ありがとう@ Thariama–
カイル

1
私たちTL:DRタイプの場合、最初に強調表示された行として誤ったソリューションを使用するのは少し混乱します:-)
skoll 2017

1
@カイル、はるかに良い!
skoll 2017

1
sftpに1つのコマンドでファイルをアップロードするオプションが含まれていないのは奇妙だと思います。これは問題なく動作しますが、このような単純な操作にはハックすぎます。それは私が見つけることができる唯一のものであり、実際に箱から出して動作するので、感謝します。:)
Teekin 2017

7

単一のファイルをアップロードするには、bashスクリプトを作成する必要があります。sshpassインストールしている場合、OSXでは次のようなものが機能するはずです。

使用法:

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を使用した1行のコマンドを使用して、リモートサーバーからファイルを取得し、ローカルマシンの特定の場所にファイルを保存します。sftpのみのOSXで動作することを確認しました。
カイル

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

これは、さまざまな場所にあるさまざまなファイルに対して1日に数回行うプロセスであるため、ターミナル(常に開いている)の1行に入力してEnterキーを押すだけのコマンドを記憶できると便利です。を使用--batchするには、コマンドをファイルに入れてから、そのファイルをパラメーターとして渡す必要があります。私はまだ遊んでいますscp、私はそれが私の解決策を含んでいるかもしれないと感じています。
カイル

たぶん「期待する」はあなたが探しているものです。linuxjournal.com/article/3065
Synthesirpatel

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がメッセージを送信するとクラッシュするなど、修正されないバグがいくつかあります。ただし、使いやすさの点では、開発者は何年も先を行っていました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.