• Opret dig
  • Glemt adgangskode

User account menu

  • Artikler
  • Forside
  • Forum
  • Nyheder
  • Log ind
Hjem
LinuxIN.dk

Snak med

Opret dig!

Af peque | 04.03.2015 08:43

bruge cut kommando & tilgå PSQL database i et bashscript mm

Hjælp generelt
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.

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 ?




  • Log ind eller opret dig for at tilføje kommentarer

Kommentarer9

# 1

10 år 4 måneder siden

Permalink

Indsendt af dudsen den 4. marts 2015 kl. 09:19

Permalink

et hint

fra "man psql"

-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
  • Log ind eller opret dig for at tilføje kommentarer

# 2

10 år 4 måneder siden

Permalink

Indsendt af peque den 4. marts 2015 kl. 09:35

In reply to et hint by dudsen

Permalink

Hej Dudsen.
Ja fandt den men

Hej Dudsen.
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
'
  • Log ind eller opret dig for at tilføje kommentarer

# 3

10 år 4 måneder siden

Permalink

Indsendt af peque den 4. marts 2015 kl. 10:11

Permalink

Nu har jkeg lavet følgende

Nu har jkeg lavet følgende som test - men tror ikke min find kommando sender parameteret med over til Notice.sh

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
  • Log ind eller opret dig for at tilføje kommentarer

# 4

10 år 4 måneder siden

Permalink

Indsendt af peque den 4. marts 2015 kl. 11:30

Permalink

Nu er det lykkedes mig at

Nu er det lykkedes mig at få parameter med over men jeg kan ganske enkelt ikke få mit SQL kald tilæ at fungere
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

  • Log ind eller opret dig for at tilføje kommentarer

# 5

10 år 4 måneder siden

Permalink

Indsendt af dudsen den 4. marts 2015 kl. 13:43

Permalink

tA

Har du prøvet at fodre psql med optionen "-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
  • Log ind eller opret dig for at tilføje kommentarer

# 6

10 år 4 måneder siden

Permalink

Indsendt af peque den 4. marts 2015 kl. 15:01

In reply to tA by dudsen

Permalink

hey Dudsen.
Har du password

hey Dudsen.
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';"`

  • Log ind eller opret dig for at tilføje kommentarer

# 7

10 år 4 måneder siden

Permalink

Indsendt af dudsen den 4. marts 2015 kl. 15:30

Permalink

Har du password på din

#6:
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.
  • Log ind eller opret dig for at tilføje kommentarer

# 8

10 år 4 måneder siden

Permalink

Indsendt af dudsen den 4. marts 2015 kl. 19:11

Permalink

et ekseriment

hvis jeg læser brugere fra en fil med flere linier får jeg en tilsvarende fejl med en for(foreach) lykke får jeg noget der er rigtigt.

# 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.
  • Log ind eller opret dig for at tilføje kommentarer

# 9

10 år 4 måneder siden

Permalink

Indsendt af peque den 5. marts 2015 kl. 06:09

Permalink

Reelt set er det hele delt

Reelt set er det hele delt op i 2 afdelinger.
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`
  • Log ind eller opret dig for at tilføje kommentarer

Svar søges

llumos Unix-operativsystem, 0
Den er go 0
14. februar = I Love Free Software Day 0
Lokal fil-deling - for de dovne. 0
Linux fra begynder til professionel af O'Reilly 0

Seneste aktivitet

PCLinuxOS 39
Hvad med en afstemming Malar 3
den er sjov 3
Reserve kernel og btrfs 3
En snak om Linux-kompatibel software 12
"Intet realistisk alternativ" - mig i r*ven 17
Open source events i danmark? 3
Virtuel maskine? 4
Gode anmeldelser Zorin OS 17.3 8
Open Source-eksperimentet 5
Nulstilling af adgangskode 6
Ingen Mint 5
Linux App Store Flathub når 3 milliarder downloads 2
Digitaliseringsministeriet sætter gang i pilotprojekt om digital suverænitet 3
Mest sikker webbrowser 5
Firefox 2
Privatbeskeder 7
Backup/synkronisering? 3
BigLinux 5
Chatgpt satire 1

© 2025 Linuxin og de respektive skribenter

Oprettet og drevet af nørder siden 2004 !