때로는 원격 서버에서 로컬 컴퓨터로 파일을 빠르게 복사해야합니다. 내 현재 워크 플로는 다음과 같습니다.
- 원격 서버에 SSH로 연결하여 파일을 찾고 전체 경로를 복사합니다.
- 새 터미널 탭을 열고 다음을 입력하십시오.
sftp user@hostname:/path/to/file
(여기서 / path / to / file은 이전에 복사 한 경로입니다)
그런 고통은 아니지만 sftp 명령을 입력 할 때 1 단계를 건너 뛰고 탭 완성을 사용하여 파일의 경로를 찾을 수 있다면 정말 좋을 것입니다.
예를 들어, sftp user@hostname:/
press를 입력 TAB하고 /에 폴더 목록을 가져올 수 있습니다. 그런 다음 ho
프레스 를 계속 입력 하면 등으로 TAB자동 완성됩니다 home
.
이러한 기능이 존재하는지 확실하지 않은 경우 이론적으로 사용자 정의 탭 완성 스크립트를 작성하는 것이 가능합니까? 어디서부터 시작해야합니까?
답변
shellholic의 답변 덕분에 sftp에서 작동시킬 수있었습니다. 먼저 /etc/bash_completion.d/sftp
다음 내용으로 파일 을 작성하십시오 .
# custom sftp(1) based on scp
# see http://askubuntu.com/questions/14645/is-it-possible-to-get-tab-completion-with-sftp
#
_sftp()
{
local configfile cur userhost path prefix
COMPREPLY=()
cur=`_get_cword ":"`
_expand || return 0
if [[ "$cur" == *:* ]]; then
local IFS=$'\t\n'
# remove backslash escape from :
cur=${cur/\\:/:}
userhost=${cur%%?(\\):*}
path=${cur#*:}
# unescape spaces
path=${path//\\\\\\\\ / }
if [ -z "$path" ]; then
# default to home dir of specified user on remote host
path=$(ssh -o 'Batchmode yes' $userhost pwd 2>/dev/null)
fi
# escape spaces; remove executables, aliases, pipes and sockets;
# add space at end of file names
COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \
command ls -aF1d "$path*" 2>/dev/null | \
sed -e "s/[][(){}<>\",:;^&\!$=?\`|\\ ']/\\\\\\\\\\\\&/g" \
-e 's/[*@|=]$//g' -e 's/[^\/]$/& /g' ) )
return 0
fi
if [[ "$cur" = -F* ]]; then
cur=${cur#-F}
prefix=-F
else
# Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
set -- "${COMP_WORDS[@]}"
while [ $# -gt 0 ]; do
if [ "${1:0:2}" = -F ]; then
if [ ${#1} -gt 2 ]; then
configfile="$(dequote "${1:2}")"
else
shift
[ "$1" ] && configfile="$(dequote "$1")"
fi
break
fi
shift
done
[[ "$cur" == */* ]] || _known_hosts_real -c -a -F "$configfile" "$cur"
fi
# This approach is used instead of _filedir to get a space appended
# after local file/dir completions, and $nospace retained for others.
local IFS=$'\t\n'
COMPREPLY=( "${COMPREPLY[@]}" $( command ls -aF1d $cur* 2>/dev/null | sed \
-e "s/[][(){}<>\",:;^&\!$=?\`|\\ ']/\\\\&/g" \
-e 's/[*@|=]$//g' -e 's/[^\/]$/& /g' -e "s/^/$prefix/") )
return 0
}
complete -o nospace -F _sftp sftp
그런 다음 bash . /etc/bash_completion.d/sftp
에서 스크립트를로드하기 위해 실행해야합니다 .
내가 실제로 한 것은 scp 완료 스크립트를 복사 / 붙여 넣기하고 /etc/bash_completion.d/ssh
scp 발생을 sftp로 바꾸는 것입니다.
답변
또 다른 대안 : lftp
대신 탭 완성 기능이 내장 된 대신 사용 하십시오 (그러나 쉘에서 시작하지 않고 일단 시작하면됩니다). 그것은 sftp 및 다른 많은 프로토콜과 대화 할 수 있습니다.
답변
사용하지 마십시오 sftp
, 사용 scp
과 작동합니다. ssh 키가 필요합니다.
답변
with-readline 이라는 프로그램 이 표준 OpenSSH 명령 행 프로그램 sftp 가 탭 완성을 활용할 수있게 한다고 들었습니다 . 작동하는지 확인할 수는 없지만 수년 동안 동일한 기능을 원했습니다.
with-readline 및 sftp에 대한 정보 :
http://www.greenend.org.uk/rjk/2005/withreadline.html
with-readline 링크 :
http://www.greenend.org.uk/rjk/2005/with-readline-0.1.tar.bz2
그것이 당신을 위해 어떻게 작동하는지 알려주세요.