Linux 호스트에서 sftp 를 사용하여 로그 파일을 원격 호스트로 전송해야 합니다. 운영 그룹에서 동일한 자격 증명을 제공 받았습니다. 그러나 다른 호스트를 제어 할 수 없으므로 RSA 키를 생성하고 다른 호스트와 공유 할 수 없습니다.
그렇다면 cron 작업을 sftp
통해 Bash 스크립트 내부에서 명령 (사용자 이름 / 비밀번호 제공) 을 실행할 수 있습니까?
비슷한 Stack Overflow 질문 인 Bash 스크립트에서 sftp에 암호 지정을 찾았 지만 내 문제에 대한 만족스러운 답변이 없습니다.
답변
공개 키 인증 이외의 몇 가지 옵션이 있습니다.
sshpass에 기회를 주기로 결정한 경우 다음과 같이 작업하는 스크립트 스 니펫이 있습니다.
export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
cd incoming
put your-log-file.log
bye
!
답변
또 다른 방법은 lftp를 사용하는 것입니다.
lftp sftp://user:password@host -e "put local-file.name; bye"
이 방법의 단점은 컴퓨터의 다른 사용자가 같은 도구에서 암호를 읽을 수 있고 암호 ps
가 쉘 기록의 일부가 될 수 있다는 것입니다.
LFTP 4.5.0부터 사용할 수있는보다 안전한 대안은 LFTP_PASSWORD
환경 변수를 설정하고로 lftp를 실행하는 것입니다 --env-password
. 전체 예는 다음과 같습니다.
LFTP_PASSWORD="just_an_example"
lftp --env-password sftp://user@host -e "put local-file.name; bye"
LFTP에는 멋진 미러링 기능도 포함되어 있습니다 (전송 확인 후 삭제 포함 --Remove-source-files
).
lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com
답변
사용하기 좋은 프로그램입니다.
우분투에서 다음을 설치하십시오 :
sudo apt-get install expect
CentOS 머신에서 다음을 설치하십시오 :
yum install expect
sftp 서버에 연결 한 다음 로컬 시스템에서 원격 sftp 서버로 로컬 파일을 업로드한다고 가정합니다.
#!/usr/bin/expect
spawn sftp username@hostname.com
expect "password:"
send "yourpasswordhere\n"
expect "sftp>"
send "cd logdirectory\n"
expect "sftp>"
send "put /var/log/file.log\n"
expect "sftp>"
send "exit\n"
interact
그러면 서버에 대한 비밀번호로 sftp 연결이 열립니다.
그런 다음 파일을 업로드 할 디렉토리 (이 경우 “logdirectory”)로 이동합니다.
이는 / var / log /에있는 로컬 디렉토리에서 파일 이름이 file.log 인 로컬 디렉토리에서 원격 서버의 “logdirectory”로 로그 파일을 업로드합니다.
답변
쉘 스크립트에서 lftp를 대화식으로 사용할 수 있으므로 다음을 수행하여 비밀번호가 .bash_history에 저장되지 않도록하십시오.
vi test_script.sh
파일에 다음을 추가하십시오.
#!/bin/sh
HOST=<yourhostname>
USER=<someusername>
PASSWD=<yourpasswd>
cd <base directory for your put file>
lftp<<END_SCRIPT
open sftp://$HOST
user $USER $PASSWD
put local-file.name
bye
END_SCRIPT
put 파일 입력을 위해 호스트, 사용자, 패스 및 디렉토리를 편집 한 후 vi 편집기를 작성 / 종료 한 :wq
다음 스크립트를 실행 가능하게 chmod +x test_script.sh
만들고 실행하십시오 ./test_script.sh
.
답변
최근 서버 간 파일 전송을 보호하기 위해 ftp에서 sftp로 전환하라는 요청을 받았습니다. --password
명령 행에서 비밀번호를 전달 하는 옵션이있는 Tectia SSH 패키지를 사용하고 있습니다 .
예 : sftp --password="password" "userid"@"servername"
배치 예 :
(
echo "
ascii
cd pub
lcd dir_name
put filename
close
quit
"
) | sftp --password="password" "userid"@"servername"
help 명령 ( sftp -h
)을 실행하기 전에 다양한 웹 사이트를보고 있었기 때문에이 정보를 공유해야한다고 생각 했고 비밀번호 옵션을보고 놀랐습니다.
답변
보다 적은 비밀번호로 인증을 사용하여 대체 할 수 있습니다. 그러나 가기 전에 키 (pub, priv)를 설치해야합니다.
로컬 서버에서 다음 명령을 실행하십시오.
Local $> ssh-keygen -t rsa
프롬프트되는 모든 옵션을 보려면 ENTER를 누르십시오. 값을 입력 할 필요가 없습니다.
Local $> cd .ssh
Local $> scp .ssh/id_rsa.pub user@targetmachine:
Prompts for pwd$> ENTERPASSWORD
다음 명령을 사용하여 원격 서버에 연결
Local $> ssh user@targetmachine
Prompts for pwd$> ENTERPASSWORD
원격 서버에서 다음 명령을 실행하십시오.
Remote $> mkdir .ssh
Remote $> chmod 700 .ssh
Remote $> cat id_rsa.pub >> .ssh/authorized_keys
Remote $> chmod 600 .ssh/authorized_keys
Remote $> exit
암호가없는 인증을 테스트하려면 로컬 서버에서 다음 명령을 실행하십시오. 비밀번호없이 연결해야합니다.
$> ssh user@targetmachine
답변
sshpass를 잠겨진 자격 증명 파일과 결합하면 실제로 아무 것도 안전합니다. 자격 증명 파일을 읽을 수있는 루트가있는 경우 모든 베팅은 종료됩니다.