Hoe voer je het sftp-commando uit met een wachtwoord uit het Bash-script?

Ik moet een logbestand naar een externe host overbrengen met behulp van sftpvanaf een Linux-host. Ik heb hiervoor referenties gekregen van mijn operatiegroep. Omdat ik echter geen controle heb over een andere host, kan ik geen RSA-sleutels genereren en delen met de andere host.

Dus is er een manier om de opdracht sftpuit te voeren (met de opgegeven gebruikersnaam/wachtwoord) vanuit het Bash-script via een cron-taak?

Ik heb een vergelijkbare Stack Overflow-vraag gevonden, Specificeer wachtwoord voor sftp in een Bash-script, maar er was geen bevredigend antwoord op mijn probleem.


Antwoord 1, autoriteit 100%

Je hebt een paar andere opties dan het gebruik van openbare-sleutelverificatie:

  1. Gebruik sleutelhanger
  2. Gebruik sshpass(minder beveiligd maar waarschijnlijk die aan uw eisen voldoet)
  3. Gebruik verwacht(minst beveiligd en meer codering nodig)

Als je besluit om sshpass een kans te geven, is hier een werkend scriptfragment om dit te doen:

export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
   cd incoming
   put your-log-file.log
   bye
!

Antwoord 2, autoriteit 57%

Een andere manier is om lftp te gebruiken:

lftp sftp://user:password@host  -e "put local-file.name; bye"

Het nadeel van deze methode is dat andere gebruikers op de computer het wachtwoord van hulpmiddelen zoals pskunnen lezen en dat het wachtwoord onderdeel kan worden van uw Shell-geschiedenis.

Een veiligder alternatief dat beschikbaar is, omdat LFTP 4.5.0 de LFTP_PASSWORDOmgevingsvariabele instellen en LFTP uitvoeren met --env-password. Hier is een volledig voorbeeld:

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

LFTP bevat ook een coole spiegelfunctie (kan verwijderen na bevestigde overdracht --Remove-source-files):

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

Antwoord 3, Autoriteit 30%

EXPECTis een geweldig programma om te gebruiken.

op ubuntu installeren het met:

sudo apt-get install expect

Op een Centos-machine installeren het met:

yum install expect

Laten we zeggen dat u een verbinding wilt maken met een SFTP-server en vervolgens een lokaal bestand uploaden vanaf uw lokale apparaat naar de SFTP-server op afstand

#!/usr/bin/expect
spawn sftp [email protected]
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

Hiermee wordt een SFTP-verbinding geopend met uw wachtwoord op de server.

Dan gaat het naar de map waar u uw bestand wilt uploaden, in dit geval “logdirectory”

Hiermee uploadt u een logbestand uit de lokale directory gevonden op / var / log / met de naam van het bestand zijn bestand. LOG NAAR DE “LOGDIRECTORY” OP DE REMOTE SERVER


Antwoord 4, Autoriteit 14%

U kunt LFTP interactief gebruiken in een Shell-script, zodat het wachtwoord niet is opgeslagen in .bash_history of vergelijkbaar door het volgende te doen:

vi test_script.sh

Voeg het volgende toe aan uw bestand:

#!/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

en schrijf / Sluit de VI-editor nadat u de host, gebruiker, pass en map voor uw POP-bestand typen :wqDIENTHEN maakt, maak uw script uitvoerbaar chmod +x test_script.shen voer het uit ./test_script.sh.


Antwoord 5, Autoriteit 9%

I is onlangs gevraagd om over te schakelen van FTP naar SFTP, om de bestandsoverdracht tussen servers te beveiligen. We gebruiken het SSH-pakket Tectia, dat een optie --passwordheeft om het wachtwoord op de opdrachtregel door te geven.

Voorbeeld: sftp --password="password" "userid"@"servername"

Batch-voorbeeld:

(
  echo "
  ascii
  cd pub
  lcd dir_name
  put filename
  close
  quit
    "
) | sftp --password="password" "userid"@"servername"

Ik dacht dat ik deze informatie zou moeten delen, omdat ik naar verschillende websites keek, voordat ik de Help-opdracht uitvoerde (sftp -h), en was ik verrast om de wachtwoordoptie te zien.


Antwoord 6, Autoriteit 9%

U kunt overschrijven door wachtwoord minder authenticatie mogelijk te maken. Maar u moet de toetsen (pub, priv) installeren voordat u daarvoor gaat.

Voer de volgende opdrachten uit bij de lokale server.

Local $> ssh-keygen -t rsa 

Druk op ENTER voor alle aangegeven opties. Er moeten geen waarden worden getypt.

Local $> cd .ssh
Local $> scp .ssh/id_rsa.pub user@targetmachine:
Prompts for pwd$>  ENTERPASSWORD

Maak verbinding met de externe server met behulp van de volgende opdracht

Local $> ssh user@targetmachine
Prompts for pwd$> ENTERPASSWORD

Voer de volgende opdrachten op op Remote Server

Remote $> mkdir .ssh
Remote $> chmod 700 .ssh
Remote $> cat id_rsa.pub >> .ssh/authorized_keys
Remote $> chmod 600 .ssh/authorized_keys
Remote $> exit

Voer de volgende opdracht uit bij Local Server om wachtwoord-minder authenticatie te testen.
Het moet zonder wachtwoord worden aangesloten.

$> ssh user@targetmachine

Antwoord 7, Autoriteit 4%

Combineer Sshpass met een opgesloten inlogbestand en in de praktijk is het zo veilig als alles – als je root op het vakje hebt om het bestandsbestand te lezen, zijn alle weddenschappen toch uitgeschakeld.


Antwoord 8, Autoriteit 3%

Bash-programma wacht tot sftp om een wachtwoord vraagt en stuurt het dan mee:

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

Misschien moet je de verwachting installeren, verander de formulering van ‘Wachtwoord’ in kleine letters ‘p’ om overeen te komen met wat je prompt ontvangt. Het probleem hier is dat het uw wachtwoord in platte tekst in het bestand en in de opdrachtgeschiedenis weergeeft. Wat in de eerste plaats bijna het doel van het hebben van een wachtwoord verslaat.


Antwoord 9, autoriteit 3%

Je kunt er sshpass voor gebruiken. Hieronder staan de stappen

  1. Installeer sshpass voor Ubuntu – sudo apt-get install sshpass
  2. Voeg het externe IP-adres toe aan uw bestand met bekende host als dit de eerste keer is
    Voor Ubuntu -> ssh gebruiker@IP -> voer ‘ja’ in
  3. geef er een gecombineerd commando van scp en sshpass voor.
    Hieronder vindt u een voorbeeldcode voor het omgaan met oorlog tegen een kater op afstand
    sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps

Antwoord 10

De gemakkelijkste manier die ik heb gevonden om dit te bereiken, zonder een bibliotheek van derden te installeren, zoals Expect, SSHPASS…etc, is door een combinatie van CURLen SFTP. Die twee zitten bijna in elke Linux-machine.

Dit is de opdracht die u moet uitvoeren, nadat u de waarden hebt gewijzigd.

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"

Voorbeeld:

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

Uitleg:

We maken verbinding met de server 10.10.10.10:77met de gebruikersnaam adminen wachtwoord 123456, om het bestand te verplaatsen /home/admin/test.txtvan die server naar de server die u momenteel gebruikt om de bovenstaande opdracht uit te voeren.


Antwoord 11

Je kunt een Python-script met scp- en os-bibliotheek gebruiken om een systeemaanroep te doen.

  1. ssh-keygen -t rsa -b 2048 (lokale machine)
  2. ssh-copy-id gebruiker@remote_server_address
  3. maak een Python-script zoals:
   import os
    cmd = 'scp user@remote_server_address:remote_file_path local_file_path'
    os.system(cmd)
  1. maak een regel in crontab om je script te automatiseren
  2. klaar

Other episodes