bruge cut kommando & tilgå PSQL database i et bashscript mm
Hej Forum.
Jeg er ved at lave lidt automatisering af scripts på en fileserver, således jeg ikke selv konstant skal ind og tjekke.
Jeg skal have et script der starter med at teste alderen på filerne únder /data
Pr fil den finder skal den så sende navnet videre til et andet script - der reelt sender en mail til vedkommende der har ansvaret for filen.
Disse mailadresser står i en PSQL database på localhost - men det er her mit problem kommer lidt ind?
Selve script der tjekker alderen.
Selve scriptet notice - skal slå op i databasen og finde emailadressen på den person der skal sendes info til.
Dette giver følgende parameter ind i det næste script
/data/firma/bruger/xrx550XC.ppd
Hvor jeg skal have grabbet bruger ud og bruge dette i mit psql kald .
Hvordan skal den linie laves helt eftersom den skal gennemløbe det parameter den får fra scriptet
Så er lidt i tvivl om hvordan jeg skal cutte bruger ud af den linie ?
Jeg er ved at lave lidt automatisering af scripts på en fileserver, således jeg ikke selv konstant skal ind og tjekke.
Jeg skal have et script der starter med at teste alderen på filerne únder /data
Pr fil den finder skal den så sende navnet videre til et andet script - der reelt sender en mail til vedkommende der har ansvaret for filen.
Disse mailadresser står i en PSQL database på localhost - men det er her mit problem kommer lidt ind?
Selve script der tjekker alderen.
find /data/* -mtime +89 -exec /scripts/notice.sh {} \;
Selve scriptet notice - skal slå op i databasen og finde emailadressen på den person der skal sendes info til.
Dette giver følgende parameter ind i det næste script
/data/firma/bruger/xrx550XC.ppd
Hvor jeg skal have grabbet bruger ud og bruge dette i mit psql kald .
Hvordan skal den linie laves helt eftersom den skal gennemløbe det parameter den får fra scriptet
Så er lidt i tvivl om hvordan jeg skal cutte bruger ud af den linie ?
Kommentarer9
et hint
-c command, --command=command
Specifies that psql is to execute one command string, command, and then exit.
De givet et eksempel længere nede i den sektion af man pagen.
du kan også skrive din sql som en .sql fil og kalde psql med -f
psql er selvfølgeligt postgre's cli klient fundet i pakken "postgresql-client" på debian/ubuntu
Hej Dudsen.
Ja fandt den men
Ja fandt den men skal lige have lavet mit cut først - således min kommando til PSQL bliver korrekt ?
Som sagt -. det parameter jeg får ind er /data/firma/bruger/test.txt --> Hvor jeg meget gerne vil har bruger grebbet ud - så det kan bruges i mit SQL kald
'
Nu har jkeg lavet følgende
check_age.sh
#!/bin/bash
#
# This script checkes files under /data for their age
# If more than 1 days old - it'll send a email
find /data/*/*/*.* -mtime +1 -exec ./notice.sh {} \;
Dette udskriver stien til næste script
notice.sh
#!/bin/bash
#
# This script checkes files under /data for their age
# If more than 90 days old - it'll send a email
########################################################
#
# $1 = Filename
#
#######################################################
FILE='$1'
EMPLOYEE='echo $1 | cut -d \/ -f 4'
RECIEPT='su postgres -H -- psql -d database -c "SELECT created from users where userid='$EMPLOYEE';"'
echo $RECIEPT
echo $EMPLOYEE
#EOF
Det eneste udskrift jeg får fra disse script - for at tjekke op på tingene:
sudo -u postgres -H -- psql -d database-c "SELECT created from users where userid=echo $1 | cut -d \/ -f 4;"
echo $1 | cut -d \/ -f 4
Så er der nogle der kan se nogle fejl her siden jeg tester parameter EMPLOYEE med linien echo /data/firma/brugfer/test.txt | cut -d \/ -f 4 --> kommer bruger ud korrekt
Nu er det lykkedes mig at
Tror mit problem ligger i ' " ` --> Hvordan skal det stilles op
RECIEPT= su postgres -c "SELECT email FROM users WHERE userid=' $EMPLOYEE ';
For at få dette til at fungere - hvordan skal den linie stilles op - således at mit RECIEPT parameter bliver den mailadresse der trækkes ud fra min Postgres Database
tA
dudsen@...:~# myoutput=`psql -d pgbench -c "SELECT delta FROM pgbench_history WHERE aid='$myaid';"` ; echo $myoutput
delta ------- -3793 (1 row)
dudsen@...:~# myoutput=`psql -tA -d pgbench -c "SELECT delta FROM pgbench_history WHERE aid='$myaid';"` ; echo $myoutput
-3793
virker for mig
edit tror to mangler backqoute "`"
Std output er iøvrigt multi line det can du ikke fixe med cut
hey Dudsen.
Har du password
Har du password på din DB eller tilladt alt fra localhost ?
det var ihvertfald et problem fra mit setup - det er nu rettet - med trust fra localhost.
Min kommando virker fint i selve konsollen, Men idet jeg putter det ind i scriptet - så mangler den at få det parameter med over
# psql -tA -d test -U test -c "select email from users where userid='PBJ';"
pbj@test.com
Men inde i scriptet echo'er jeg samme linie men den er tom....
I dette script udskriver jeg både parameter FILE og RECIEPT :
./check_age.sh
PBJ
RBN
WAH
Men igen som om den sagtens kan sætte den parameter der definerer initialerne _ men kan ikke få den med i min psql kald som nu ser således ud:
RECIEPT=`psql -tA -d $DATABASE -U $USERNAME -c "SELECT email FROM users WHERE userid='$EMPLOYEE';"`
Har du password på din
Har du password på din DB eller tilladt alt fra localhost ?
unix_auth eller peer ie den mapper prosgre brugere til systembrugere. 0
på samme system med en bruger der ikke har adgang til postgre
not@..:~$ psql -d pgbench -c "SELECT delta FROM pgbench_history WHERE aid='$myaid';"
psql: FATAL: role "note" does not exist
not@:~$ psql -d pgbench -U dudsen -c "SELECT delta FROM pgbench_history WHERE aid='$myaid';"
psql: FATAL: Peer authentication failed for user "dudsen"
Bruget er testsystem så har ikke rigtigt noget data ligende så kan ikke teste om @ er et problem her.
hos mig parser den fint en variabel ind
dudsen@...i:~# cat testsql.sh
sid="36383"
outval=`psql -tA -d pgbench -c "SELECT delta FROM pgbench_history WHERE aid='$sid';"`
echo $outval
dudsen@...i:~# sh testsql.sh
-3793
men jeg gør det en af gange du ser ud til at loade in fil med flere bruger id
her skal du cycle igennem dem en af gangen.
med copy paste til did system får jeg
dudsen@...:~# EMPLOYEE='echo "test not test id" | cut -d \/ -f 4'
dudsen@...:~# echo $EMPLOYEE
echo "test not test id" | cut -d \/ -f 4
Igen fordi "'" ikke er "`" du har to forskellige quote karektere der ser næsten ens ud en af de mere iriterende detaljer ved bash kunne værre en forkaring.
edit læste du fik løst de problem tror problemet er at du passer ind en varible med newline.
Backqoute sidder svjv på shift + tasten til venstre for backspace oven en knap der vist nok er mappet til en 3´je qoute karekter.
et ekseriment
# cat testpeq.sh ; echo "####output###"; bash testpeq.sh list ; echo "####working script###" ; cat testmail.sh ; "echo ###output###"; bash testmail.sh list ;
EMPLOYEE=`cat $1 | cut -d ' ' -f 1`
RECIEPT=`psql -d dudsen -c "SELECT email from userlist WHERE username='$EMPLOYEE';"`
echo $RECIEPT
echo $EMPLOYEE
####output###
email ------- (0 rows)
usera userb
####working script###
for name in `cat $1 | cut -d ' ' -f1` ;
do
email=`psql -tA -d dudsen -c "SELECT email FROM userlist WHERE username='$name';"`
echo $email
echo $name
done
echo ###output###: command not found
nobody@notavaliddomain.invalid
usera
somebody@nowhere.invalid
userb
Håber det hjælp ellers så lærte jeg lidt mere om psql og bash i processen.
Reelt set er det hele delt
1. check_age.sh finder alderen på filen og sender filen fulde sti afsted til notice.sh pr. fil den finder, hvor notice skal finde hvem der er ansvarlig for kunden og informere ham med en mail om denne fil er for gammel.
Derfor får jeg flere outputs når jeg kører det fulde script
Det input parameter jeg får ind i mit notice.sh script er /data/firma/bruger/fil.xxx - Der skal jeg grabbe bruger ud af - og via dette brugernavn finde mailadressen på den ansvarlige.
Løsningen var denne liie også skulle backquotas på
EMPLOYEE=`echo $1 | cut -d \/ -f 4`