SFTP de linha única do terminal

92

Várias vezes ao longo do dia, posso estar executando um teste em que preciso examinar um arquivo de log em um servidor remoto. Eu me acostumei a usar meu terminal para sftpo servidor remoto e puxar o arquivo de log desejado para a /tmpminha máquina local.

Eu estava examinando as opções hoje usando man sftpuma tentativa de descobrir uma maneira de executar os comandos a seguir basicamente em uma única linha para que eu não precise digitar um comando, pressionar Enter, digitar um comando pressionar Enter, etc.

(o que faço agora)

sftp myuser@myserver
--mypassword at prompt
lcd /tmp
get /dir/dir/dir/dir/file
quit

Eu encontrei enquanto procurava man sftpuma referência scpque eu não usei antes. Acho que pode ser o que estou procurando, mas não vi uma maneira de especificar onde queria que o arquivo copiado com segurança fosse.

Alguém poderia me fornecer uma maneira de obter /dir/filede um servidor remoto e fazer o download /tmp/file_plus-my-description?

Eu esperava ser capaz de executar um comando sftp ou scp semelhante a uma cópia regular do UNIX como:

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

Estou usando o TerminalMac OS X 10.8 integrado . Obrigado.

Kyle
fonte

Respostas:

204

Atualização de setembro de 2017 - tl; dr

Baixe um único arquivo de um servidor ftp remoto para a sua máquina:

sftp {user}@{host}:{remoteFileName} {localFileName}

Faça upload de um único arquivo de sua máquina para um servidor ftp remoto:

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

Resposta original:

Ok, então me sinto um pouco idiota. Mas eu descobri. Quase cheguei ao topo com:

sftp user@host remoteFile localFile

A única documentação mostrada no terminal é esta:

sftp [user@]host[:file ...]
sftp [user@]host[:dir[/]]

No entanto, encontrei este site que mostra o seguinte na sinopse:

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

Portanto, a resposta simples é você apenas fazer :depois do usuário e do host, o arquivo remoto e o nome do arquivo local. Incrivelmente simples!

Linha única, arquivo remoto de cópia sftp:

sftp username@hostname:remoteFileName localFileName
sftp kyle@kylesserver:/tmp/myLogFile.log /tmp/fileNameToUseLocally.log

Atualização de fevereiro de 2016

Caso alguém esteja procurando o comando para fazer o inverso disso e enviar um arquivo do seu computador local para um servidor remoto em uma única linha de sftp comando, o usuário @Thariama abaixo postou a solução para fazer isso. Gorjeta de chapéu para eles pelo código extra.

sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'
Kyle
fonte
20
Eu estava perguntando o contrário (copiar para o servidor remoto), mas eu mesmo encontrei: sftp {usuário} @ {host}: {dir} <<< $ 'put {caminho para o arquivo}'
Thariama
2
Minhas desculpas, mal entendido. Copiarei sua resposta na resposta, caso isso possa ajudar alguém no futuro. Obrigado @Thariama
Kyle
1
Para nós TL: tipos de DR, é um pouco confuso ter a solução incorreta como a primeira linha destacada :-)
skoll
1
@Kyle, muito melhor!
Skoll
1
Acho bizarro que o sftp não inclua uma opção para enviar um arquivo em um único comando. Isso funciona bem, mas é muito hacky para uma operação tão simples. Ainda é a única coisa que posso encontrar que realmente funciona fora da caixa, então obrigado. :)
Teekin
7

Para fazer o UPLOAD de um único arquivo, você precisará criar um script bash. Algo como o seguinte deve funcionar no OS X se você tiver sshpassinstalado.

Uso:

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

Coloque este script em algum lugar do seu caminho e chame-o de 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
sstur
fonte
Obrigado pela resposta, no entanto, a resposta que indiquei acima utilizará o comando de linha única com sftp para obter um arquivo de um servidor remoto e salvar o arquivo em um local específico em sua máquina local. Eu verifiquei que ele funcionará no OS X apenas com sftp.
Kyle
2
Sim, essa é certamente a melhor resposta para transferência de local remoto para local. No entanto, pensei em adicionar uma solução para fazer o oposto: local para remoto. Apenas no caso de ser útil para alguém. Obrigado!
sstur
3

sftp oferece suporte a arquivos em lote.

Na página de manual:

-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*).
synthesizerpatel
fonte
Como esse é um processo que faço várias vezes ao dia para arquivos diferentes em lugares diferentes, seria bom ser capaz de simplesmente memorizar um comando que eu poderia digitar em uma única linha do meu terminal (que está sempre aberto) e pressionar Enter. O uso --batchexigiria que eu colocasse meus comandos em um arquivo e, em seguida, passasse esse arquivo como um parâmetro. Ainda estou brincando scp, acho que pode conter minha solução.
Kyle
Talvez 'esperar' seja o que você está procurando então. linuxjournal.com/article/3065
synthesizerpatel
3

Ou echo 'put {path to file}' | sftp {user}@{host}:{dir}, que funcionaria em Unix e PowerShell.

js2010
fonte
Essa sintaxe também funciona com puttyftp (psftp). Só pensei em compartilhar, já que esse é o motivo pelo qual acabei aqui
9 Guy
1

Uma pequena modificação como a abaixo funcionou para mim ao usá-la de dentro da chamada de perl e system ():

sftp {user}@{host} <<< $'put {local_file_path} {remote_file_path}'
user2443447
fonte
1

Resposta SCP

O OP mencionou SCP, então aqui está.

Como outros apontaram, SFTP é confuso, pois a sintaxe de upload é completamente diferente da sintaxe de download . Fica um pouco mais fácil de lembrar se você usar o mesmo formulário:

echo 'put LOCALPATH REMOTEPATH' | sftp USER@HOST
echo 'get REMOTEPATH LOCALPATH' | sftp USER@HOST

Na realidade, isso ainda é uma bagunça, e é por isso que as pessoas ainda usam comandos "desatualizados", como SCP:

scp USER@HOST:REMOTEPATH LOCALPATH
scp LOCALPATH USER@HOST:REMOTEPATH

SCP é seguro, mas desatualizado. Ele tem alguns bugs que nunca serão corrigidos, nomeadamente travar se o servidor .bash_profileemitir uma mensagem. No entanto, em termos de usabilidade, os desenvolvedores estavam anos à frente.

cz
fonte