programing

Bash 스크립트에서 sftp 명령을 비밀번호로 실행하려면 어떻게 해야 합니까?

closeapi 2023. 4. 16. 15:08
반응형

Bash 스크립트에서 sftp 명령을 비밀번호로 실행하려면 어떻게 해야 합니까?

Linux 호스트에서 sftp를 사용하여 로그 파일을 원격 호스트로 전송해야 합니다.업무 그룹으로부터 같은 자격 정보를 제공받았습니다.그러나 다른 호스트를 제어할 수 없기 때문에 RSA 키를 생성하여 다른 호스트와 공유할 수 없습니다.

'우리'를 요?sftp명령어(사용자명/패스워드가 제공됨)는 크론 작업을 통해 Bash 스크립트 내부에서 이루어집니다.

Bash 스크립트에서 sftp에 패스워드 지정과 같은 스택오버플로우 질문을 발견했지만, 문제에 대한 만족스러운 답변이 없었습니다.

공개 키 인증을 사용하는 것 외에 몇 가지 옵션이 있습니다.

  1. 체인 사용
  2. sshpass 사용(보안성은 낮지만 요건을 충족할 수 있음)
  3. expect 사용(최저 보안으로 더 많은 코딩 필요)

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비밀번호가 셸 기록의 일부가 될 수 있습니다.

.5이 LFTP 4.5.0을 에 보다 한 대체 합니다.LFTP_PASSWORD"lftp"를 사용하여 .--env-password하다

export LFTP_PASSWORD="just_an_example"
lftp --env-password sftp://user@host  -e "put local-file.name; bye"

# Destroy password after use
export LFTP_PASSWORD=""

에는, 쿨 기능도 된 전송 LFTP 의 후 됩니다).--Remove-source-files

lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com

EXPECT이치노

Ubuntu에서 다음을 사용하여 설치합니다.

sudo apt-get install expect

온 어센트OS 머신에 인스톨 하는 방법:

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")로 이동합니다.

파일명이 file.log인 /var/log/의 로컬디렉토리에서 리모트서버의 「log directory」에 로그 파일이 업로드 됩니다.

셸 스크립트에서 인터랙티브하게 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 파일, put 파일, put 파일, put 파일, put 파일, pass, put 파일, put 파일, put 파일, put 파일, put 파일, put 파일, put 파일, put 파일, put 파일, put 파일, put 파일, put 파일, put 파일, vi write/quit/합니다.:wq 가능하게 .chmod +x test_script.sh./test_script.sh.

최근 서버 간의 파일 전송을 보호하기 위해 ftp에서 sftp로 전환하라는 요청을 받았습니다.Tactia 패키지를 SSH Tactia SSH 입니다.Tactia SSH--password이치노

::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

Expect, SSHPASS 의 서드파티 라이브러리를 설치하지 않고 이를 실현하는 가장 쉬운 방법은 CURL과 SFTP조합하여 사용하는 것입니다.이 두 개는 거의 모든 Linux 머신에 있습니다.

값을 변경한 후 실행해야 하는 명령어입니다.

curl  -k "sftp://SERVER_IP:SERVER_PORT/FULL_PATH_OF_THE_FILE" --user "SERVER_USER:SERVER_PASSOWRD" -o "THE_NAME_OF_THE_FILE_AFTER_DOWNLOADING_IT"

예:

curl  -k "sftp://10.10.10.10:77/home/admin/test.txt" --user "admin:123456" -o "test.txt"

설명:

사용자명 admin과 패스워드 123456을 사용하여 서버 10.10.10:77접속하여 /home/admin/test 파일을 이동합니다.의 명령어를 실행하기 위해 현재 사용하고 있는 서버에 txt를 추가합니다.

sshpass와 잠긴 credential 파일을 조합하면 실제로는 어떤 것과 마찬가지로 안전합니다.credential 파일을 읽기 위한 root이 박스에 있는 경우, 모든 베팅은 무효가 됩니다.

bash 프로그램이 sftp가 패스워드를 요구할 때까지 기다렸다가 패스워드를 송신합니다.

#!/bin/bash
expect -c "
spawn sftp username@your_host
expect \"Password\"
send \"your_password_here\r\"
interact "

expect를 설치해야 할 수 있습니다. 'Password'의 문구를 프롬프트와 일치하도록 소문자 'p'로 변경합니다.여기서의 문제는, 커맨드 이력 뿐만이 아니라, 파일내의 일반 텍스트로 패스워드를 표시하는 것입니다.애초에 암호를 만들려는 목적을 거의 달성하지 못한 거죠

sshpass를 사용할 수 있습니다.다음 단계는 다음과 같습니다.

  1. Ubuntu용 sshpass 설치 -sudo apt-get install sshpass
  2. Ubuntu -> ssh user@ 를 처음 사용하는 경우 리모트 IP 를 기존 호스트 파일에 추가합니다.IP -> yes 라고 입력합니다.
  3. scp 명령어와 sshpass 명령어를 조합하여 지정합니다.리모트 Tomcat에 대한 전쟁 대응 코드 예를 다음에 나타냅니다.sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps

몇몇 사람들이 말했다.sshpass하지만 명확한 코딩 예는 많지 않습니다...

rsync 백업에 bash 스크립트를 사용하는 방법은 다음과 같습니다.

sshpass -p "${RSYNC_PASSWORD}" sftp "${RSYNC_USER}"@"${RSYNC_REMOTE_HOST}"

명심해 두셔야 합니다.sudo apt install sshpass제대로 작동하기 전에 말이죠.

scp 및 os 라이브러리와 함께 Python 스크립트를 사용하여 시스템 호출을 할 수 있습니다.

  1. ssh-keygen -t rsa -b 2048 (로컬머신)
  2. ssh-copy-id user@remote_server_address
  3. 다음과 같은 Python 스크립트를 만듭니다.
    import os
    cmd = 'scp user@remote_server_address:remote_file_path local_file_path'
    os.system(cmd)
  1. crontab에서 규칙을 생성하여 스크립트를 자동화합니다.
  2. 다 했어요.

언급URL : https://stackoverflow.com/questions/5386482/how-to-run-the-sftp-command-with-a-password-from-bash-script

반응형