[bash] Skrypt bash i wykonanie polecenia windowsowego


(hosti) #1

Cześć,

pytanie do Was czy jest możliwość wykonania i/lub odwołania się w powłoce bash-owej do komend wykonywanych na maszynach windowsowych?.

Czy jest taka możliwość, że w bashu zrobimy zamapowanie udziału i wywołanie wywołamy test.bat lub inny exe?

  • sprawdzą plik o danej godzinie czy istnieje i czy jest "świeży"
  • wykonają kolejne sprawdzenie ale 3,5 h później
  • wyślą raport na maila

 

Jedyna komunikacja z komputerami to po adresach ip które są stałe.

Będę wdzięczny za naprowadzenie i podpowiedzi.


#2

Napisz po prostu skrypt bashowy.

Sprawdzanie czy plik istnieje i czy jest “świeży” - find z przełącznikiem -mtime/ctime - spokojnie sobie z tym poradzi.

Do wysyłania maili - mail - działa spod konsoli.

Całość obudowujesz skryptem i wrzucasz do Cron’a - on załatwi odpalanie skryptu co określony czas.


(hosti) #3

 

A jak poradzić sobie z montowaniem maszyn? 50 komputerów, skrypt wykonywany o 05:00 i 08:30 na wszystkich jednocześnie?

Sprawdzam właśnie smbclinet ale smbclient //10.0.0.1/c$ -U user pyta o hasło które trzeba wpisać ręcznie.


#4

A, nie doczytałem że maszyny są z Windowsem.

Logowanie za pomocą klucza?


(hosti) #5

 

Nie potrzebne do user i pass wszędzie takie same. Teraz tylko pytanie jak zrobić, żeby podpiąć 50 hostow.

Działa mi montowanie:

mount -t cifs -o username="user",password="pasword" //10.0.0.10/c$ /mnt/montownik

Jakaś pętla a ip jako zmienną?


(pocolog) #6

Jeśli numery ip są po kolei to pętlą for powinieneś elegancko to załatwić http://bash.0x1fff.com/petla-for


(Barmazu) #7

Nie zapomnij odmontować na koniec skryptu :smiley:


(hosti) #8

 

No właśnie nie są, różne przedziały, myślałem o jakimś zaczytywaniu z pliku txt lub może jakieś tablice? IP np.  10.0.1.103, 10.10.20.109 etc

 

 

No właśnie wczoraj zastanawiałem się dlaczego mi się wysypuje i nie montuje kolejnego :slight_smile:


(pocolog) #9

Możesz czytać z pliku. Rzuć okiem na ten temat. http://stackoverflow.com/questions/10929453/bash-scripting-read-file-line-by-line


(nintyfan) #10

Można uznać, że adresy IP są z danego(dużego) przedziału. Wtedy pingujesz każdy ip z tego przedziału, i jeżeli ping zwróci 0, to komputer istnieje, a jeżeli zwróci coś innego, to wykonujesz kolejną iterację.


(hosti) #11

takie pytanie na szybko, czy mogę w if jako warunek dać wykonanie polecenia? Ewentualnie jakiś errorlog czy coś podobnego?

if <find . -iname "*.mojplik" -ctime 0> ; then
    echo "Jest ok"
fi

 

Z adresami IP już sobie poradziłem. Komputery mają stałe adresy IP ale z różnych przedziałów. Sprawę załatwiła pętla for jak sugerował @pocolog - thx

for ip in 10.0.10.1 10.2.20.10 10.0.10.230 itd...; do
#montowanie zasobu
mount -t cifs -o username="user",password="password" //$ip/c$ /mnt/mont
...
...
...
umount /mnt/mont
done

(nintyfan) #12
if find . -iname "*.mojplik" -ctime 0; then
echo "Jest ok"
fi

(hosti) #13

A czy można jakoś przekierować echo do pliku?

#!/bin/bash

# Tworzenie pliku z informacjami
echo "Sprawdzanie pliku z dnia :" > index.txt
date >> index.txt
echo "---------------------------------------------" >> index.txt

# Petla podstawiajaca adres IP
for ip in 10.0.10.1 10.2.20.10 192.168.1.10 ; do

# Montowanie zasobu"
mount -t cifs -o username="user",password="password" //$ip/c$ /mnt/montownik
cd /mnt/montownik/mojkat/

#Zapis do pliku log gdzie sprawdzamy
echo " Sprawdzam kompa $ip" >> index.txt
#Szukanie pliku 
if find . -iname "*.mojplik" -ctime 0; then
echo "OK plik istnieje" >> index.txt
else "NOK brak pliku <----- NOK " >> index.txt
fi

cd /
umount /mnt/montownik
done

Wszystko przed pętlą idzie do pliku, to co w pętli już nie. :confused:

Wywala standardowo na konsoli efekt sprawdzania

 

./katalog1/kat2/12.mojplik

./katalog1/kat2/12.mojplik

./katalog1/kat2/12.mojplik

itd ze wszystkich komputerów.


(pocolog) #14
else "NOK brak pliku <----- NOK " >> index.txt

else echo "NOK brak pliku <----- NOK " >> index.txt

?


(hosti) #15

 

Faktycznie w else zapomniałem wpisać echo, ale mimo to jeżeli jest

then
echo "OK plik istnieje" >> index.txt

powinien przekierować do pliku wpis a tego nie robi…

 

bo wywołując skrypt dostaję informację bezpośrednio w konsoli

root@maszyna:/home/user#./skrypt
./katalog1/kat2/12.mojplik
./katalog1/kat2/12.mojplik
./katalog1/kat2/12.mojplik

(pocolog) #16

Nie bawiłem się nigdy na tyle bashem, ale wygląda na problem z warunkiem if. Może to Cię nakieruje nim znajdzie się ktoś kto lepiej to rozgryzie :wink: http://dief.republika.pl/if.html


(hosti) #17

Powoli dostaję kociokwiku :slight_smile:

cały skrypt wygląda tak:

#!/bin/bash

# Tworzenie pliku z informacjami
    printf "Sprawdzanie plików :\n" > /home/user/zdalny/log.txt
    date >> /home/user/zdalny/log.txt
    printf " _______________________________________ \n" >> /home/user/zdalny/log.txt

# Petla podstawiajaca adres IP
    for ip in 192.168.0.100 192.168.0.101 192.168.0.102 192.168.0.103 192.168.20.101 192.168.20.102 192.168.20.103 itd.... ; do

#Zapis do pliku log gdzie sprawdzamy
    printf "Sprawdzam $ip\n" >> /home/user/zdalny/log.txt

# Montowanie zasobu i przejscie do folderu "
    mount -t cifs -o username="user",password="pass" //$ip/c$ /mnt/montownik
    sleep 2
    cd /mnt/montownik/mojkat/
 

#Szukanie pliku MOJ
    if find . -iname "*.MOJ" -mtime 0 >> /home/user/zdalny/log.txt; 
        then
	       printf "OK plik istnieje\n" >> /home/user/zdalny/log.txt
        else 
	       printf "NOK brak pliku <----- NOK\n" >> /home/user/zdalny/log.txt
    fi

#Przejscie do folderu drugiego
    cd /
    cd /mnt/montownik/Program\ Files/MOJKAT/PODKATALOG/PLIKI/

#Szukanie pliku NKP
    if find . -iname "*.NKP" -mtime 0 >> /home/user/zdalny/log.txt; 
        then
            printf "OK plik istnieje\n------------------\n" >> /home/user/zdalny/log.txt
        else 
            printf "NOK brak pliku <----- NOK\n------------------\n" >> /home/user/zdalny/log.txt
    fi

#Przejscie i odmontowanie udzialu
    cd /
    umount /mnt/montownik
    sleep 2
done

W rezultacie dostaję takie wyniki:

Sprawdzanie plików MOJ i NKP :
czw, 19 lut 2015, 08:32:41 CET
_______________________________________
Sprawdzam komputer 192.168.0.100
./KAT1/KAT2/KAT3/KAT4/KAT5/plik.MOJ
OK plik istnieje
./DRUGI_PLIK.NKP
OK plik istnieje
------------------
Sprawdzam komputer 192.168.0.101
./KAT1/KAT2/KAT3/KAT4/KAT5/1011.MOJ
OK plik istnieje
./DRUGI_PLIK.NKP
OK plik istnieje
------------------
Sprawdzam komputer 192.168.0.102
./KAT1/KAT2/KAT3/KAT4/KAT5/1014.MOJ
OK plik istnieje
./DRUGI_PLIK.NKP
OK plik istnieje
------------------
Sprawdzam komputer 192.168.0.103
./KAT1/KAT2/KAT3/KAT4/KAT5/1007.MOJ
OK plik istnieje
./DRUGI_PLIK.NKP
OK plik istnieje
------------------

Wszystko jest ok do momentu gdy dostaję jakieś śmieci lub w przypadku gdy pliku nie ma…

Czasami listuje więcej plików jak np tu:

Sprawdzam komputer 192.168.0.101
./KAT1/KAT2/KAT3/KAT4/KAT5/1011.MOJ
./KAT1/KAT2/KAT3/KAT4/KAT5/1012.MOJ
OK plik istnieje
./DRUGI_PLIK.NKP
OK plik istnieje
------------------


A gdy brakuje pliku dostaję informację OK
------------------
Sprawdzam komputer 192.168.0.103
./KAT1/KAT2/KAT3/KAT4/KAT5/1007.MOJ
OK plik istnieje

OK plik istnieje
------------------

Czy ktoś z Was może pomóc/podpowiedzieć co jest nie tak? Może coś źle napisane?

Próbowałem ctime 0, mtime 0 i atime 0.

Z góry dzięki za każdą podpowiedź.