Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: bash script dd met progress bar  (gelezen 13741 keer)

Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #25 Gepost op: 2019/05/31, 14:07:42 »
ik heb jouw oplossing wel geprobeerd maar bij werkt het niet. Ik denk niet dat dat iets met dialog te maken heeft maar vooral met pv. Ik heb diverse commando's met pv geprobeerd op mijn pc maar het lukt telkens niet. Als ik heel gestructureerd ga zoeken naar wat er fout gaat dan zal ik het uiteindelijk wel wat vinden maar daar heb ik eigenlijk geen zin meer in.

het werken met scripts vind ik niet eenvoudig. Heel vaak staat er net een spatie verkeerd en dat valt niet echt op.
Soms is er een fout en dan zie ik hem niet. Als ik dan dezelfde regel vanuit een andere plek kopiëer dan werkt het ineens wel. Maar dan zie ik dus geen verschil en weet ik niet wat er fout was.
Het is een gepriegel waar ik nu even genoeg van heb.Maar ik heb hier wel weer veel van geleerd.
 
« Laatst bewerkt op: 2019/05/31, 14:39:31 door peer »

Offline Bloom

  • Lid
Re: bash script dd met progress bar
« Reactie #26 Gepost op: 2019/05/31, 19:59:53 »
Dit script werkt compleet correct onder Debian Testing en Debian Sid (allebei Buster). Stretch heb ik niet geprobeerd. KDE ook niet, maar ik er is geen verschil in het gebruik en de output van pv.
#!/bin/sh
if  [ -z "$1" ]
then
  echo "Geef invoerbestand (iso) op + uitvoer-driveletter."
else
  if [ -f "$1" ]
  then
    IsoFile="$1"
    if [ -z "$2" ]
    then
      echo "Geef uitvoer-driveletter op!"
    else
      OutDrv="$2"
      #dd if="$IsoFile" bs=8M | pv | sudo dd of="/dev/sd$OutDrv" bs=8M conv=notrunc; sync
      #sudo dd if="$IsoFile" of="/dev/sd$OutDrv" bs=8M conv=notrunc status=progress; sync
      sudo echo "Ga in rootmodus zolang we niet in de GUI zitten..."
      (pv -n "$IsoFile" | sudo dd of="/dev/sd$OutDrv" bs=128M conv=notrunc,noerror) 2>&1 | dialog --gauge "Uitvoeren van dd-bevel, even geduld..." 10 70 0
    fi
  else
    echo "Opgegeven invoerbestand (iso) bestaat niet!"
  fi
fi

Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #27 Gepost op: 2019/06/01, 07:43:58 »
ik heb het even geprobeerd. in eerste instantie werkte het niet. Ik kreeg de melding "permission denied" bij de iso.
Daarna heb ik even alleen de belangrijkste regel gebruikt:
#!/bin/sh
sudo echo "Ga in rootmodus zolang we niet in de GUI zitten..."
(pv -n "/home/peer/temp.iso" | sudo dd of="/dev/sdd" bs=128M conv=notrunc,noerror oflag=sync) 2>&1 | dialog --gauge "Uitvoeren van dd-bevel, even geduld..." 10 70 0
Nu werkt het. Ik heb wel weer de optie oflag=sync toegevoegd. het script heb ik in de terminal uitgevoerd. De terminal kleurde wel blauw. (zie bijlage)

Waarom het eerst niet werkte en nu wel snap ik niet.


Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #28 Gepost op: 2019/06/01, 10:49:18 »
@Bloom,
bedankt voor je hulp. Het is fijn om verder te kunnen met een scriptje dat werkt.
hier de testversie die bij mij werkt:
#!/bin/sh

usbDevice="/dev/sdd"
isoFile="/home/peer/temp.iso"
password="wachtwoord"

echo "$password" | sudo -S echo "Ga in rootmodus zolang we niet in de GUI zitten..."
(pv -n "$isoFile" | sudo -S dd of="$usbDevice" bs=128M conv=notrunc,noerror oflag=sync)2>&1 | dialog --gauge "Uitvoeren van dd-bevel, even geduld..." 10 70 0
   
#(pv -n "$isoFile" | (echo "$password" | sudo -S dd of="$usbDevice" bs=128M conv=notrunc,noerror oflag=sync))2>&1 | dialog --gauge "Uitvoeren van dd-bevel, even geduld..." 10 70 0
De eerste regel (nr.7) met sudo wordt gebruikt om het wachtwoord op te slaan. Sudo onthoudt het wachtwoord 5 minuten (dacht ik) tenzij dit anders is opgenomen in het bestand /etc/sudoers. Hierdoor hoeft sudo bij het dd-command het wachtwoord op te vragen. Dit kan wel maar dat gebeurt dan in de progressbar en dat ziet er niet uit.
Dit vind ik wel een heel erg slim trucje.

In mijn oorspronkelijk script gebruik ik  "echo "$password" | sudo -S"om sudo te laten werken met een opgeslagen wachtwoord.  Hier lukt het me niet. Waarschijnlijk omdat ik met haakjes moet werken om de totale opdracht met pv en dd logisch te houden maar dat lukt me niet. Zie de laatste commentaarregel.

Probleem: Het script werkt als ik het in de terminal uitvoer. Als ik het zonder terminal wil laten draaien dan wordt de progressbar niet getoond. 

iets anders: Je gebruikt bij de dd-opdracht de optie bs=128M. Ik geloof dat dit de maximale blokgrootte is. Daarbij heb je de opties: conv=notrunc,noerror staan. Zijn deze opties noodzakelijk voor de gekozen blokgrootte??

Offline Bloom

  • Lid
Re: bash script dd met progress bar
« Reactie #29 Gepost op: 2019/06/01, 11:44:19 »
Notrunc zegt dat hij de datastroom niet mag afkappen. Noerror zegt dat hij bij een fout niet mag stoppen met een dump maar moet verdergaan. Je kunt noerror eventueel combineren met sync (conv=notrunc,noerror,sync) en dan zal hij bij een fout de blok aanvullen met nullen zodat de lengte blijft kloppen. Deze sync heeft dus een heel andere betekenis dan die van oflag=sync (flush de cache).

Als je bron een iso-bestand is kun je die noerror weglaten. En ook als je een 100% identieke kopie wenst.

Wachtwoorden in plaintext in een bash script zetten en dan pipen naar sudo is een zwaar veiligheidslek en wordt daarom niet aanbevolen. Maar met de parameter -s kan het dus wel.
De tekst achter de eerste sudo met echo wordt niet getoond in de oplossing met Dialog, dus eventueel kun je die ook vervangen door "!" om het typwerk minimaal te houden.
Eenmaal in sudo ingelogd is de standaardinstelling inderdaad dat de inlog 5 minuten "gecached" wordt en kan dit ervoor zorgen dat je in een veel ingewikkelder bevel met allerlei redirecties toch een sudo kunt gebruiken zonder dat daar opnieuw een wachtwoord vereist is. Je zou natuurlijk in sudoers ook kunnen opnemen dat voor dd geen wachtwoord vereist is, dan is wel nog sudo vereist als je een dd doet naar een drive, maar wordt dus geen wachtwoord verlangd. Dat kan een oplossing zijn om geen plaintext wachtwoorden in bash scripts te moeten zetten.

Ik gebruik dat voor mezelf (niet voor derden!) als volgt:
sudo addgroup --system admin
Hiermee voegen we een systeemgroep admin toe waar we iedereen inzetten die we bepaalde beheerrechten willen geven.
sudo usermod -a -G admin,jouwnaam
Vervolgens met sudo visudo de sudoers aanpassen:
%admin ALL=(ALL) NOPASSWD: /sbin/poweroff, /usr/sbin/poweroff, /sbin/reboot, /usr/sbin/reboot, /bin/mount, /usr/bin/mount, /bin/umount, /usr/bin/umount, /usr/sbin/pm-suspend, /usr/bin/dd
Zet dit onder de lijn met %sudo.
Ik heb het dd-bevel er al aan toegevoegd. Hier wordt dus geen wachtwoord meer gevraagd aan leden van de admin systeemgroep voor de bevelen poweroff, reboot, mount, umount, pm-suspend (de pauzeeropdracht) en dd.

Offline Bloom

  • Lid
Re: bash script dd met progress bar
« Reactie #30 Gepost op: 2019/06/01, 11:54:14 »
Nog vergeten: 128M is niet de maximum blokgrootte, dat is in feite vrijwel onbeperkt. Maar de 128M wordt hier gekozen om je een min of meer fatsoenlijke progressiebalk in Dialog te kunnen geven.
Als je de progressie volledig in tekst doet met de oflag=sync optie, gebruik je beter een veel grotere blokomvang. Voor het kopiëren van een iso naar een usb-drive kies ik altijd bs=1G. Voor grotere usb-sticks kun je ook 4G of 16G of zoiets kiezen.


Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #32 Gepost op: 2019/06/08, 12:38:11 »
het script met progressbar kreeg ik met hulp van jullie draaiend maar helaas alleen in de terminal en dat zag er niet mmoi uit in kde. Had ik misschien wel kunnen verbeteren maar daar had ik geen zin meer in.

Ik heb java weer eens afgestoft en ben daarin begonnen. Ik heb hierin lsblk gebruikt om gegevens over de usb devices op te roepen en dd om de iso te schrijven. Het dd-proces heb ik met behulp van swingworker in een aparte thread laten uitvoeren. Hierin had ik de mogelijkheid om de progressie uit het achtergrondprocess te halen en te koppelen aan de progresbar. En dit werkt.

Waar ik wel tegen aan liep is dat de truc met "echo password | sudo -S " niet werkte. Maar ik heb de IDE (eclipse) als root gestrat en toen kon ik dd gewoon uitvoeren. Merkwaardig is dat ik in het script de optie oflag=sync nodig had om de progressie zichtbaar te maken en ik in het java-programma deze optie juist niet moest hebben. Ook merkte ik dat in het daadwerkelijke dd- commando bij de source (if=/dev...) géén variabele kon gebruiken terwijl dat bij de destination (of=...) wel kon.

Het was wel behoorlijk wat uitproberen maar uiteindelijk heb ik een java programma in elkaar gefrommeld dat werkt. Nu kan ik langzaam gaan werken aan een netjes geprogrammeerde versie.

Dit is natuurlijk gewoon hobby want het dd-commando werkt heel makkelijk in de terminal en etcher is er ook nog. Het is dus niet nodig om zelf wat te maken.

Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #33 Gepost op: 2019/06/08, 15:42:08 »
bij het testen kom ik toch nog wel wat probleempjes tegen.
1. een isofile met een naam met spaties erin wordt niet geaccepteerd. Ook niet als ik "naam" of 'naam' gebruik
2. als ik een tweede keer wil schrijven dan gaat het mis. vermopeldeijkiets met vrijgeven van de usbstick of iets dergelijks.

Lastig is dat niet echt duidleijk wordt wat er precies misgaat.

Offline Bloom

  • Lid
Re: bash script dd met progress bar
« Reactie #34 Gepost op: 2019/06/08, 19:07:28 »
Met java heb ik geen ervaring, dus daar kan ik je niet mee helpen.
Maar in Bash treedt dat probleem van bestandsnamen met spaties natuurlijk ook op. Daarom moeten alle parameters en bestandsnaamvariabelen altijd tussen dubbele aanhalingstekens gebruikt worden.

Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #35 Gepost op: 2019/06/09, 07:49:24 »
de dubbele aanhalingstekens ken ik natuurlijkvan bash. In java heb ik het bashcommando gemaakt met de dubbele aanhalingstekens erin.  ik krijg java alleen nog niet zo ver dat het commando goed vertaald wordt.

nahjo

  • Gast
Re: bash script dd met progress bar
« Reactie #36 Gepost op: 2019/06/09, 10:23:04 »
de dubbele aanhalingstekens ken ik natuurlijkvan bash. In java heb ik het bashcommando gemaakt met de dubbele aanhalingstekens erin.  ik krijg java alleen nog niet zo ver dat het commando goed vertaald wordt.

Mogelijk die aanhalingsteken in een variabele plaatsen?
Basic voorbeeldje :)
let x$=chr(34)
let opdracht$="firefox "+x$+"bestand met spaties"+x$
shell(opdracht$)

Offline peer

  • Lid
Re: bash script dd met progress bar
« Reactie #37 Gepost op: 2019/06/09, 15:58:03 »
tip van Naho ook geprobeerd maar werkt niet.
Inmiddels heb ik het wel werkend.
Als je in Java een linux command wil uitvoeren dan splitst Java het commando (string) op elke spatie. Hierbij kijkt het niet naar evt. speciale tekens zoals ". Dus Java knipt ook op een spatie in een filenaam.
Via google heb ik gevonden dat je het command ook als een stringArray kan versturen.  En dan splitst Java het commando na elk element stringArray. En in dat element kunnen spaties zitten.

Ik heb geen foutmeldingen meer en kom geen gekke dingen meer tegen.  ik kan nu dus aan de slag met de definitieve versie
Hier is nog even een screenshot van de huidige nog zeer ruwe versie. (zie bijlage).