Nieuws:

Ubuntu-NL weer online!

Na een periode van technische problemen en een overbelaste server zijn we eindelijk weer bereikbaar.
Samen met Hobbynet, onze sponsor en hostingpartner, hebben we een oplossing gevonden zodat alles weer soepel draait.

Bedankt voor jullie geduld en begrip. We hopen nu weer verder te gaan waar we gebleven waren.

Het team van Ubuntu-NL

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

Auteur Topic: at commando met write commando te combineren?  (gelezen 2128 keer)

at commando met write commando te combineren?
« Gepost op: 2010/11/03, 11:35:58 »
Stel ik wil een gebruiker om 14:00 laten weten dat het lunchtijd is. Met het at commando kan je een commando op een bepaalde tijd uitvoeren. Met het write commando kan je een bericht naar een bepaalde gebruiker sturen. Is het mogelijk om deze commando's te combineren?

Het lastige is dat het write commando vraag om meer input:

Citaat
user@user-computer:~ write otheruser
write: otheruser is logged in more than once; writing to pts/0
tekst om te verzenden
en nog een regel
[toets ctrl + D om write commando te stoppen]
user@user-computer:~

Kan je deze input, inclusief de ctrl + D meegeven met het at commando zodat het gewenste bericht op een bepaalde tijd wordt getoond?




Offline heir4c

  • Lid
Re: at commando met write commando te combineren?
« Reactie #1 Gepost op: 2010/11/03, 19:30:57 »
Even mijn Linux-boek ingekeken. Je kan een script maken voor at.

Maar eerst even dit (Heb zelf even een proefje gedaan):

Als je het vanuit de terminal (console doet) dan tik je (bijv.) in:
at 14:00Let op! Een : tussen 14 en 00
Dan krijg je een "at-prompt":  at>
Daar tik je dan in:
write 'username'Zonder ' natuurlijk. En de juiste naam.
Klik op Enter. Je krijgt nog altijd de at-prompt
Daar tik je dan je tekst in. Beginnen met een " en ook eindigen met een "
Klik enter en klik dan Ctrl+D
Dan zie je dit staan:
at> EOTEOT = end of text
Dan zal de gebruiker exact om 14u het bericht krijgen.

Je kan ook bijvoorbeeld:
at now +5minutengebruiken om binnen 5minuten na de huidige tijd het bericht te versturen.
Of:
at thu next weekOm het volgende week dinsdag te versturen
of nog:
now +1 dayMorgen om deze tijd (tijd waarop je het aanmaakt)
Enz...

Hier (in het boek) staat ook een verwijzing naar het commando: crontab


Dit kan je ook in een bestand zetten, een shell script dus. Als je dat doet moet je -f toevoegen en daarna (met een spatie ertussen) de bestandsnaam van het shell-script.
Ik denk dat je dan alleen maar de write instructies moet gebruiken in het script en dan via:
at -f bestandsnaamwaarachter je dan de tijd zet, het shell-script zal toegevoegd worden aan at en uitgevoerd worden tijdens de aangegeven tijd/dag.

Zo kan je scripts uitvoeren die al klaarstaan maar waar geen tijd/datum bij/in staat.

Met:
at -lkrijg je alle at-opdrachten die momenteel op uitvoering staan te wachten.
Om een opdracht uit de wachtrij te verwijderen gebruik je de optie -d

En je hebt nog altijd de man-pages van 'at' voor meer info.

Hopelijk heb je hier iets aan.

En zelf heb ik nu ook wat bijgeleerd door dit even op te zoeken. ThX.

Met vriendelijke groet,
heir4c

« Laatst bewerkt op: 2010/11/03, 19:36:05 door heir4c »
Tip: https://makkelijkelinuxtips.blogspot.com/p/1.html en http://wiki.ubuntu-nl.org/   Upload-site:http://imgur.com/
be Open be Free be Ubuntu

Re: at commando met write commando te combineren?
« Reactie #2 Gepost op: 2010/11/03, 23:00:31 »
Bedankt voor de antwoorden. :)

Ik heb zelf ook nog even verder gezocht, en ben er nu uit.

user@userlaptop:~$ at 22:56
warning: commands will be executed using /bin/sh
at> write user2 <<End
at> tekst
at> tekst
at> 123123123
at> End
at> <EOT>     (hier op ctrl+d gedrukt)
job 9 at Wed Nov  3 22:56:00 2010
thomas@tommie-laptop:~$

Dit geeft precies het gewenste bericht bij user2:
user2@user2:~$
Message from user@user-laptop on (none) at 22:56 ...
tekst
tekst
123123123
EOF
user2@user2:~$

Het gebruik van << is een here-document, voor wie er meer over wil weten. :)

Offline heir4c

  • Lid
Re: at commando met write commando te combineren?
« Reactie #3 Gepost op: 2010/11/03, 23:29:07 »
En wat is dan een "here-document" (Ik wil er dus wat meer over weten.  =D)
Tip: https://makkelijkelinuxtips.blogspot.com/p/1.html en http://wiki.ubuntu-nl.org/   Upload-site:http://imgur.com/
be Open be Free be Ubuntu

Re: at commando met write commando te combineren?
« Reactie #4 Gepost op: 2010/11/04, 00:21:07 »
Met Googlen kom je een hoop te weten. ;) Er staan genoeg uitleg over here documents op het net. Maar goed, in het Nederlands misschien niet, dat weet ik niet.

Met een here-document kan je als het ware tekst doorsturen naar een commando. Het woord achter de << is het teken dat de invoer afgesloten wordt, en de regels die je ernaar tikt tot dit woord is de tekst die in het commando wordt gevoerd. In plaats van een bestand op schijf (document) kan je op deze manier direct invoer van meerdere regels in een commando invoeren (here-document). Dit wordt vaak gebruikt om bijvoorbeeld gebruiksaanwijzingen in scripts op te slaan. Bijvoorbeeld:

cat <<EOF
Dit is de gebruiksaanwijzing van een script, die uit vele regels bestaat.
Op deze manier hoef je niet alle regels van een echo commando te voorzien.
En het ziet er in de code een stuk duidelijker uit.
Maar here documenten zijn dus nog voor veel meer dingen bruikbaar.
EOF

In het geval van het write commando hoef je zo geen ctrl+d te toetsen, maar wordt het einde van de invoer dus aangegeven met het woord achter de << .

Ik heb het commando bijvoorbeeld eerder gebruikt in het volgende script om een lijst met teamleden op te slaan in het script. Ik had er niet meer aan gedacht, maar eigenlijk had ik die oplossing al eerder gebruikt dus.. Op deze manier hoef je geen apart bestand voor dergelijke data te gebruiken, maar kan je die data in een script zelf opslaan:

#!/bin/bash
# This script looks in the logfile of an irc meeting if teammembers
# were attending the meeting. The output is a wiki tekst where
# teammembers who attended are grouped by their team(s) and teams
# that were not present are also shown
# usage: irc_aanwezig pad/naar/logfile

logfile=$1
teams="Artwork Beheer Documentatie Forum Irc Prikboard Promotie Vertaal Website"
declare -A teamlist
declare -a namelistarray

function namelist
{
cat <<'EOF'
cafuego:Cafuego:Irc
DooitzedeJong:Dooitze de Jong:Artwork:Documentatie
Double12:Double12:Prikboard:Promotie
femke98:Femke98:Forum
Hannie:Hannie:Vertaal
heir4c:Heir4c:Forum
JanC:Jan Claeys:Irc
johanvd:Johanvd:Forum:Documentatie
joolz:Joolz:Irc:Vertaal
Joshua822:Joshua:Documentatie
Nunslaughter:Nunslaughter:Forum
ronnie_vd_c:Ronnie:Artwork:Promotie
seveas:Dennis:Beheer:Website
Sjoerd:Sjoerd:Forum
SWAT:SWAT:Beheer:Irc:Vertaal
testcees:Testcees:Documentatie
Thomas_de_Graaff:Thomas de Graaff:Artwork:Promotie
trijntje:trijntje:Vertaal
Vistaus:Vistaus:Forum
Wazzzaaa:Wazzzaaa:Vertaal
EOF
}

# Check if logfile is given and readable
if [[ -z $logfile ]];then
    echo "Argument ontbreekt, gebruik: irc_aanwezig /pad/naar/irc/logfile"
    exit 1
elif [[ ! -f "${logfile}" ]];then
    echo "Logfile ${logfile} bestaat niet."
    exit 1
elif [[ ! -r "${logfile}" ]];then
    echo "Logfile ${logfile} is niet leesbaar."
    exit 1
fi

# Check for every line in the namelist if the user is in logfile
# and if so, check if user is teammember and add user to teamlist

ifs="$IFS" #backup $IFS (internal field separator)
IFS=$'\n'  #set IFS to newline
namelistarray=($(namelist)) # put namelist in array

for dataline in ${namelistarray[@]};do
    ircname="${dataline%%:*}" #first item in dataline
    partline="${dataline#*:}"
    name=${partline%%:*} #second item in dataline
    # Check if ircname user is in logfile
    if [ "$(grep "<${ircname}>" $logfile)" ];then
        # Check if user is member of teams
        IFS=" " # Set internal field separator to space
        for team in $teams;do
            if [[ $dataline == *$team* ]];then
                # add user to teamlist
                teamlist[$team]="${teamlist[$team]}, ${name}"
            fi
        done
        IFS=$'\n' # Set internal field separator back to newline
    fi
done
IFS=$ifs #restore internal field separator

# Generate output to screen and file

rm $PWD/teamgrab.tmp
echo
echo "=== Aanwezige teams ==="
for team in $teams;do
    if [ -n "${teamlist[$team]}" ];then
        echo " * ${team} team (${teamlist[$team]#, })"
    fi
done
echo "=== Afwezige teams ==="
for team in $teams;do
    if [ -z "${teamlist[$team]}" ];then
        echo " * ${team} team"|tee -a "$PWD/teamgrab.tmp"
    fi
done
exit 0
« Laatst bewerkt op: 2010/11/04, 00:30:43 door Thomas de Graaff »

Offline heir4c

  • Lid
Re: at commando met write commando te combineren?
« Reactie #5 Gepost op: 2010/11/04, 18:36:50 »
ThX voor de info.
Ben bijlange zover nog niet en moet even in mijn haar krabben.  =D Begrijp maar ten dele, maar dat komt nog wel goed (denk ik  :))
Tip: https://makkelijkelinuxtips.blogspot.com/p/1.html en http://wiki.ubuntu-nl.org/   Upload-site:http://imgur.com/
be Open be Free be Ubuntu

Offline ivo

  • Lid
Re: at commando met write commando te combineren?
« Reactie #6 Gepost op: 2010/11/04, 21:33:18 »
Bedankt voor de antwoorden. :)

Ik heb zelf ook nog even verder gezocht, en ben er nu uit.


Ik ben wel érg benieuwd waar de ontvanger het bericht gaat zien.
Kan je dat hier laten weten, zodra dat bekend is?
There are only 10 types of people in the world; those who understand binary and those who don't.

Re: at commando met write commando te combineren?
« Reactie #7 Gepost op: 2010/11/05, 10:29:43 »
@ ivo, dat staat in bovenstaand bericht al, user2 is de ontvangende gebruiker. ;)

@ heir4c, idd, zo werkt het meestal met het leren van complexe systemen. Eerst begrijp je het half, en later als je meer elementen van zo'n systeem kent vallen dingen op hun plek. Ik kom dat ook regelmatig tegen, en ik denk iedereen die met Linux of andere systemen werkt wel. :)
« Laatst bewerkt op: 2010/11/05, 10:32:42 door Thomas de Graaff »

Offline heir4c

  • Lid
Re: at commando met write commando te combineren?
« Reactie #8 Gepost op: 2010/11/05, 18:31:05 »
@ ivo, dat staat in bovenstaand bericht al, user2 is de ontvangende gebruiker. ;)

Ivo bedoeld als je grafisch werkt hoe het dan gaat. In de console werkt het prima maar hoe doe je dat in een grafische omgeving? Dan moet je toch nog één en ander toevoegen aan de commando's, niet?
Tip: https://makkelijkelinuxtips.blogspot.com/p/1.html en http://wiki.ubuntu-nl.org/   Upload-site:http://imgur.com/
be Open be Free be Ubuntu

Re: at commando met write commando te combineren?
« Reactie #9 Gepost op: 2010/11/05, 19:43:43 »
Grafisch, daar heb je Skype voor geloof ik, of msn. ;) (Grafisch zou ik zo niet weten.)

Offline ivo

  • Lid
Re: at commando met write commando te combineren?
« Reactie #10 Gepost op: 2010/11/05, 23:01:58 »
Grafisch, daar heb je Skype voor geloof ik, of msn. ;) (Grafisch zou ik zo niet weten.)

Wat een zwaktebod.... sorry....

Nee, voor at in combinatie met write is skype of msn geen alternatief. Het lijkt er niet eens op.

En hoe stuur je een write naar een user op een andere PC op
- de console
- in een x-terminal

?
There are only 10 types of people in the world; those who understand binary and those who don't.

Re: at commando met write commando te combineren?
« Reactie #11 Gepost op: 2010/11/05, 23:19:07 »
Nog maar een keer dan, en zonder Skype en knipoog.

Ik weet het niet Ivo. :)