Gå til innhold

[Løst] Shell-skripting


Anbefalte innlegg

Jeg har fått en festlig oppgave. Jeg vet ikke engang hvor jeg skal starte :(


Sjefen vår har bedt oss om å lage et program hvor vi kan sjekke om alle filene i /tmp mappen har de riktige rettigheter (755). Hvis de gjør det, la dem der. Hvis de ikke gjør det, så må de fjernes. HINT: If, then, else.


Noen som har noen gode råd?



Mvh Expose


Lenke til kommentar
Videoannonse
Annonse

Takker for raskt svar!

Bare et par spørsmål:

1. Vil dette slette filer som har 755, eller alle andre?

2. Hvordan legge til at skriptet skal gå igjennom /tmp mappen ?

Skriptet ligger i /home/david/shellapp

#!/bin/bash

for fil in *; do
  rettigheter=`stat -c "%a" $fil`
  if [ "$rettigheter" != "755" ]; then
    rm "$fil"
  fi
done

Ga dette resultatet:

david@ubuntu:~/shellapp$ ./tmpchk
./tmpchk: line 5: [: missing `]'
./tmpchk: line 5: [: missing `]'

Endret av expose
Lenke til kommentar

Bare å endre path. Scriptet kan også kortes ned om man bruker $() operatoren (eller hva man kaller den). Som du ser fjerner den filer som ikke har 755 som rettigheter (rwxr-xr-x).

 

Benytt man stat osv. for å forstå hva de forskjellige argumentene gjør. Avslutt man (egentlig editoren less) ved å trykke q.

$ ls -l /tmp/perms
total 0
-rw-r--r-- 1 tim tim 0 20.10.13 00:24 asdf
-rwxr-xr-x 1 tim tim 0 20.10.13 00:23 bar
-rwxr-xr-x 1 tim tim 0 20.10.13 00:23 foo

$ for f in /tmp/perms/*; do
>     if [ $(stat -c "%a" $f) != "755" ]; then
>         rm $f
>     fi
> done

$ ls -l /tmp/perms
total 0
-rwxr-xr-x 1 tim tim 0 20.10.13 00:23 bar
-rwxr-xr-x 1 tim tim 0 20.10.13 00:23 foo
Endret av Occi
Lenke til kommentar

 

1. Ja

2. Erstatt den første linja med

for file in /tmp/*; do
david@ubuntu:/tmp$ ls
VMwareDnD vmware-root
david@ubuntu:/tmp$ ls -l
total 8
drwxrwxrwt 2 root root 4096 Oct 19 12:32 VMwareDnD
drwx------ 2 root root 4096 Oct 19 12:32 vmware-root
Dette ligger fortsatt igjen i /tmp/
Hva kan være feil?
Endret av expose
Lenke til kommentar

De mappene er eid av root (starter på d for directory), så om du kjører dette med en annen bruker kan du ikke slette de. Ikke at du burde heller, de filene er sannsynligvis nødvendig for at (den virtuelle) maskinen skal fungere. Søk om VMware for mer info. Det er neppe meningen at de skal slettes.

Endret av Occi
Lenke til kommentar

De mappene er eid av root (starter på d for directory), så om du kjører dette med en annen bruker kan du ikke slette de. Ikke at du burde heller, de filene er sannsynligvis nødvendig for at (den virtuelle) maskinen skal fungere. Søk om VMware for mer info. Det er neppe meningen at de skal slettes.

Vil det si at sudo ikke kan brukes noe sted?

Lenke til kommentar

Neida. Du kan alltid bruke sudo, men det er ikke gitt at du bør/skal slette de mappene. I oppgaven defineres det "om alle filene i /tmp mappen har de riktige rettigheter (755)". Så det kan hende at det er meningen å la mappene være i fred.

Endret av Occi
Lenke til kommentar

Neida. Du kan alltid bruke sudo, men det er ikke gitt at du bør/skal slette de mappene.

ok

Ved kjøring for jeg denne:


./tmpchk: line 3: syntax error near unexpected token `do'
./tmpchk: line 3: `$ for f in /tmp/*; do'
david@ubuntu:~/shellapp$ nano tmpchk

skal $ være foran for

Lenke til kommentar

Her sletter jeg kun filer som ikke har rettigheter 755.

Jeg har ikke laget et script, skriver det like greit rett inn i shellet. Det har ingenting å si.

 

Legg merke til at det er kun filen "asdf" som blir borte. "moshimoshi" som er en mappe, men ikke har 755, blir ikke fjernet. Merk også at standardrettigheter for mapper er 755 med directory flag. Denne er 644.

 

Du har et mellomrom foran $ i $(stat ...)

$ ls -l
total 4.0K
drw-r--r-- 2 tim tim 4.0K 20.10.13 00:45 moshimoshi
-rw-r--r-- 1 tim tim    0 20.10.13 00:31 asddsa
-rwxr-xr-x 1 tim tim    0 20.10.13 00:23 bar
-rwxr-xr-x 1 tim tim    0 20.10.13 00:23 foo

$ for f in /tmp/perms/*; do
>     # sjekk først om objektet er en fil (og ikke mappe)
>     # deretter sjekk at rettighetene ikke er 755
>     if [[ -f $f ]] && [ $(stat -c "%a" $f) != "755" ]; then
>         rm $f
>     fi
> done

$ ls -l
total 4.0K
drw-r--r-- 2 tim tim 4.0K 20.10.13 00:45 moshimoshi
-rwxr-xr-x 1 tim tim    0 20.10.13 00:23 bar
-rwxr-xr-x 1 tim tim    0 20.10.13 00:23 foo
Endret av Occi
Lenke til kommentar

#!/bin/bash

$ for f in /tmp/*; do
     # sjekk først om objektet er en fil (og ikke mappe)
     # deretter sjekk at rettighetene ikke er 755
     if [[ -f $f ]] && [ $(stat -c "%a" $f) != "755" ]; then
         rm $f
     fi
done

Blir helt sprø! For jeg for dette svaret:

david@ubuntu:~/shellapp$ ./tmpchk
./tmpchk: line 3: syntax error near unexpected token `do'
./tmpchk: line 3: `$ for f in /tmp/*; do'
david@ubuntu:~/shellapp$

Lenke til kommentar

Som jeg sa, jeg skriver min kode direkte inn i et shell. "$" indikerer kun en prompt i shellet. Her er det hele presentert som innhold i en script-fil om det er enklere å forstå.

#!/usr/bin/env bash

for f in /tmp/perms/*; do
    # sjekk først om objektet er en fil (og ikke mappe)
    # deretter sjekk at rettighetene ikke er 755
    if [[ -f $f ]] && [ $(stat -c "%a" $f) != "755" ]; then
        rm $f
    fi
done
Endret av Occi
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...