App installieren
How to install the app on iOS
Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Bash: lokale Variablen auf remote host über ssh ausführen
- Ersteller ghostadmin
- Erstellt am
ghostadmin
Grand Admiral Special
Ich habe folgenden Codeausschnitt
Funktioniert aber leider vorne und hinten nicht. Es kommt z.B. Fehlermeldung das es zpool nicht gibt (Befehl existiert auf remote system aber nicht lokal) oder die Variable $device ist leer.
Die Befehle scheinen teilweise lokal ausgeführt zu werden.
for device in ... das scheint lokal statt remote zu laufen
Lässt man die ganzen checks weg, dann geht es. Aber kann man das nicht irgendwie so hinbiegen?
Code:
sshuser=root
sshhost=remotehost
sshport=8022
zfsdisks=da1
zfspool=tank
rsyncpasswd=$(cat /etc/.rsyncpass)
ssh "${sshuser}@${sshhost}" -p "$sshport" bash -s << EOF
echo "shell is" $SHELL
checkzfs=$(zpool list | grep $zfspool | awk '{ print $7}')
if [ "$?" != "ONLINE" ]; then
for device in $zfsdisks; do
echo $rsyncpasswd | geli attach -j - /dev/${device}
done
sleep 5
zpool import -R $zfspool
sleep 5
else
echo "Zpool is online"
fi
EOF
Funktioniert aber leider vorne und hinten nicht. Es kommt z.B. Fehlermeldung das es zpool nicht gibt (Befehl existiert auf remote system aber nicht lokal) oder die Variable $device ist leer.
Die Befehle scheinen teilweise lokal ausgeführt zu werden.
for device in ... das scheint lokal statt remote zu laufen
Lässt man die ganzen checks weg, dann geht es. Aber kann man das nicht irgendwie so hinbiegen?
flybyray
Vice Admiral Special
Vermutlich solltest du das mal beachten:
http://en.wikipedia.org/wiki/Here_document#Unix-Shells
Denn aktuell werden eben deine Befehle lokal evaluiert.
---------- Beitrag hinzugefügt um 07:26 ---------- Vorheriger Beitrag um 07:24 ----------
Here wollte jemand auch etwas ähnliches machen nur dass der Ausführungskontext in diesem Fall ein SQL Interpreter war und die Variablen vom Interpreter zu evaluiert werden müssen und nicht vom lokalen Prompt.
http://stackoverflow.com/questions/2500436/how-does-cat-eof-work-in-bash
http://en.wikipedia.org/wiki/Here_document#Unix-Shells
By default, variables are interpolated and commands in backticks are evaluated.
yields:Code:cat << EOF Working dir $PWD EOF
This can be disabled by quoting any part of the label. For example by setting it in single or double quotes:Code:Working dir /home/user
yieldsCode:cat << "EOF" Working dir $PWD EOF
Code:Working dir $PWD
Denn aktuell werden eben deine Befehle lokal evaluiert.
---------- Beitrag hinzugefügt um 07:26 ---------- Vorheriger Beitrag um 07:24 ----------
Here wollte jemand auch etwas ähnliches machen nur dass der Ausführungskontext in diesem Fall ein SQL Interpreter war und die Variablen vom Interpreter zu evaluiert werden müssen und nicht vom lokalen Prompt.
http://stackoverflow.com/questions/2500436/how-does-cat-eof-work-in-bash
tspoon
Grand Admiral Special
- Mitglied seit
- 23.04.2006
- Beiträge
- 2.727
- Renomée
- 196
- Standort
- Dresden
- Aktuelle Projekte
- was so anliegt
- Lieblingsprojekt
- WCG FightAIDS@Home
- Meine Systeme
- 2x Intel Xeon E5645 @ 2,4Ghz (Phobya UC-2 LT + 360 MagiCool Magicool G2)
- BOINC-Statistiken
- Prozessor
- Intel i7 4770K
- Mainboard
- Asus Maximus VI Gene 1150
- Kühlung
- XSPC RayStorm Wasserkühler
- Speicher
- 4 x 4GB Patriot Viper Extrem 2133
- Grafikprozessor
- 2 x AMD 290X Crossfire (Watercool HK GPU-X³)
- Display
- 3x27" Samsung S27D590 Curved
- SSD
- ADATA SP900NS34 m,2, 240GB Corsair Force 3
- HDD
- 1 TB WD Green
- Optisches Laufwerk
- LG USB-DVD-Brennder
- Gehäuse
- Xigmatek Aquila Window
- Netzteil
- Coolermaster Silent Pro 1000Watt (Singlerail)
- Betriebssystem
- Windows 8.1
- Webbrowser
- Chrome
- Verschiedenes
- T500Rs + TH8RS
- Schau Dir das System auf sysprofile.de an
if und for per ssh so zu übergeben wird nicht funktionieren bzw ist dies eine zu große fehlerquelle, da du nie weißt was das remotesystem ausgiibt.
du musst alle ssh-befehle für das remotesystem mit den ssh variablen ausführen und die if und for schleifen lokal auswerten.
auch kommst du hier besser nen alias für ssh zu setzen.
ich würde nie for oder if schleife an die bash eines anderen servers so übergeben.
werte auf dem remote ermitteln und lokal in if und for verarbeiten.
Nicht getestet sollte aber verdeutlichen was ich mein
du musst alle ssh-befehle für das remotesystem mit den ssh variablen ausführen und die if und for schleifen lokal auswerten.
auch kommst du hier besser nen alias für ssh zu setzen.
ich würde nie for oder if schleife an die bash eines anderen servers so übergeben.
werte auf dem remote ermitteln und lokal in if und for verarbeiten.
Code:
alias sshextern='ssh "${sshuser}@${sshhost}" -p "$sshport"'
if ( `sshextern zpool list | grep $zfspool | awk '{print $7}'` != "Online" );then
....
( sshextern zpool import -R $zfspool && echo "Import $zfspool erfolgreich" ) || echo "Import $zfspool fehlgeschlagen"
else
echo "$zfspool Online"
fi
Nicht getestet sollte aber verdeutlichen was ich mein
ghostadmin
Grand Admiral Special
Der Alias ging im Script nicht aber mit einer Variable geht dann endlich alles.
Also einfach
Bei dieser Zeile ist irgendwo ein Syntax Error:
Also einfach
Code:
sshextern="ssh ${sshuser}@{sshhost} -p $sshport"
Bei dieser Zeile ist irgendwo ein Syntax Error:
Code:
if ( `sshextern zpool list | grep $zfspool | awk '{print $7}'` != "Online" ); then
tspoon
Grand Admiral Special
- Mitglied seit
- 23.04.2006
- Beiträge
- 2.727
- Renomée
- 196
- Standort
- Dresden
- Aktuelle Projekte
- was so anliegt
- Lieblingsprojekt
- WCG FightAIDS@Home
- Meine Systeme
- 2x Intel Xeon E5645 @ 2,4Ghz (Phobya UC-2 LT + 360 MagiCool Magicool G2)
- BOINC-Statistiken
- Prozessor
- Intel i7 4770K
- Mainboard
- Asus Maximus VI Gene 1150
- Kühlung
- XSPC RayStorm Wasserkühler
- Speicher
- 4 x 4GB Patriot Viper Extrem 2133
- Grafikprozessor
- 2 x AMD 290X Crossfire (Watercool HK GPU-X³)
- Display
- 3x27" Samsung S27D590 Curved
- SSD
- ADATA SP900NS34 m,2, 240GB Corsair Force 3
- HDD
- 1 TB WD Green
- Optisches Laufwerk
- LG USB-DVD-Brennder
- Gehäuse
- Xigmatek Aquila Window
- Netzteil
- Coolermaster Silent Pro 1000Watt (Singlerail)
- Betriebssystem
- Windows 8.1
- Webbrowser
- Chrome
- Verschiedenes
- T500Rs + TH8RS
- Schau Dir das System auf sysprofile.de an
Der Syntaxfehler kommt meistens, wenn mehr als 1 Ergebnis oder kein Ergebnis bei dem "grep" raus kommt.
aber wie gesagt, habs nicht getestet, da ich kein ZFS aktuell zu hand habe. Sauber wäre die Lösung, da hier immer ein Ergebis herauskommt:
if ( `sshextern zpool list | grep $zfspool | grep -c "Online"'` -lt 1 ); then
aber wie gesagt, habs nicht getestet, da ich kein ZFS aktuell zu hand habe. Sauber wäre die Lösung, da hier immer ein Ergebis herauskommt:
if ( `sshextern zpool list | grep $zfspool | grep -c "Online"'` -lt 1 ); then
ghostadmin
Grand Admiral Special
awk hätte schon "online" geliefert, keine Ahnung aber mit dem zweiten grep gehts jetzt.
Dafür habe ich jetzt in:
Zeile 68: geli: Kommando nicht gefunden.
could not attach da1
Versucht der jetzt geli lokal auszuführen weils nach pipe kommt?
Dafür habe ich jetzt in:
Code:
( $sshextern echo $rsyncpasswd | geli attach -j - /dev/${device} && echo "attached ${device}" ) || echo "could not attach ${device}"
Zeile 68: geli: Kommando nicht gefunden.
could not attach da1
Versucht der jetzt geli lokal auszuführen weils nach pipe kommt?
Dalai
Grand Admiral Special
- Mitglied seit
- 14.06.2004
- Beiträge
- 7.420
- Renomée
- 262
- Standort
- Meiningen, Thüringen
- Mein Laptop
- Thinkpad T43 mit 15" UXGA (1600x1200), 2x 1 GiB RAM, 100GB HD, Bluetooth, GBit LAN, ATi X300
- Prozessor
- AMD Ryzen 5 2600 (Pinnacle Ridge)
- Mainboard
- ASUS Prime X370-A
- Kühlung
- Noctua NH-U12S mit 1x NF-F12
- Speicher
- Crucial Ballistix Sport LT weiß (BLS2K8G4D32AESCK): 2x 8 GiB DDR4-3200 (CL16) @ 1,25V
- Grafikprozessor
- Zotac GeForce GTX 1060 6GB AMP Edition
- Display
- Dell U2410, 24 Zoll, IPS, 16:10
- SSD
- Samsung 850 Evo 250 GB
- HDD
- WD40EZRZ (WD Blue) 4000GB SATA3, WD20EZRX (WD Green) 2000GB SATA3
- Optisches Laufwerk
- Pio DVR-212 (DVD-RAM), ASUS E818A6T (DVD-ROM), Pio DVD-106S (Slot-in DVD-ROM)
- Soundkarte
- Creative SoundBlaster Audigy 2 ZS PCI
- Gehäuse
- Lian Li PC-8NB Midi-Tower
- Netzteil
- Enermax EMP400AGT MaxPro 400W
- Betriebssystem
- Windows 7 Professional x64 und immer mal wieder ein neues Linux :-)
- Webbrowser
- Mozilla Firefox mit diversen Erweiterungen
- Verschiedenes
- 2x 120mm Gehäuselüfter (Front und Rückwand), DVBSky T9580, Sharkoon Frontpanel B (2x USB 3.0)
Ja. Ich würde gar nicht so einen Zirkus machen und ein Skript zusammenbauen und das auf dem Remote-System ausführen. Ob du das vorher zusammenbaust oder zum Auführzeitpunkt (und das dann hochlädst), ist egal.Versucht der jetzt geli lokal auszuführen weils nach pipe kommt?
MfG Dalai
ghostadmin
Grand Admiral Special
Zirkus heisst für mich mehrere Scripts und das Passwort auf einem System als Datei zu speichern wo es nicht hingehört.
Man musste nur das ganze in double quotes setzen.
Und bei dem If habe ich eckige Klammern gesetzt.
Man musste nur das ganze in double quotes setzen.
Und bei dem If habe ich eckige Klammern gesetzt.
Code:
#!/bin/bash
#rsync script for sending files over ssh to an ecrypted zfs storage
#dont forget to configure passwordless login over ssh
progname=$(basename "$0") #get this file name, used only for mail
logpath=/var/log/rsync
emailto=root
# parameters for backup target
sshuser=root
sshhost=somehost
sshport=8022
sshtargetfolder=/mnt/tank/backup # create path manually if not exist
zfspool=tank #doesnt mount on bootup because disks are encrypted
zfsdisks=da1 #encrypted disks to mount, separate multiple devices with blank between
rsyncpasswd=$(cat /etc/.rsyncpass) #stored on local disk, used on remote ssh
#additional parameters when machine resides on a esx host
esxuser=root
esxhost=someesxhost
esxport=8023
sshextern="ssh ${sshuser}@${sshhost} -p $sshport"
start_rsync()
{
echo "--- Starting $1 ---" | sudo -u "$sshuser" tee -a "$logpath"/rsync.log
startrsync=$(sudo -u "$sshuser" rsync -avze "ssh -p $sshport" --stats --progress --inplace --delete --log-file="$logpath"/rsync.log "$2" "${sshuser}@${sshhost}:${sshtargetfolder}")
# start again if errorlevel not 0 and did not run 10 times
if [ "$?" != "0" ] && [ "$i" -lt "10" ]; then
echo "There was an error during transmission, starting again ..."
((i++))
start_rsync "$1" "$2"
fi
}
#loop mount of local data with encfs and create encrypted view
#it is importand that .encfs6.xml will be kept for decrypting
#encfs --reverse /data/Dokumente /mnt/encfsDokumente
#umount with: fusermount -u /mnt/encfsDokumente
# startup remote vmware guest on a esx host
# first check if guest responds
$sshextern exit
# if return value not 0 then start guest on esx host
if [ "$?" != "0" ]; then
ssh "${esxuser}@${esxhost}" -p "$esxport" "vim-cmd vmsvc/power.on 4"
echo "wait 120s ..."
sleep 120 # allow 120sec to come up
fi
# check if guest is now alive and exit script if thats not the case
$sshextern exit
if [ "$?" != "0" ]; then
echo "could not wake up ${sshhost}"
exit $?
fi
# or use wol to wakeup
#if [ "$(ping -c 1 $sshhost | grep "1 received")" ]; then
# echo "OK: Remote host is pingable"
#else
# /usr/bin/wakeonlan "$wolmac"
# sleep 120
#fi
# attach geli encrypted disks and import zfs pool
if [ $($sshextern zpool list | grep $zfspool | grep -c "ONLINE") -ne 1 ]; then
for device in $zfsdisks; do
if [ $($sshextern geli status | grep $device | grep -c "ACTIVE") -ne 1 ]; then
( $sshextern "echo $rsyncpasswd | geli attach -j - /dev/${device}" && echo "attached ${device}" ) || echo "could not attach ${device}"
else
echo "$device already attached"
fi
done
sleep 5
( $sshextern zpool import $zfspool && echo "${zfspool} was imported" ) || echo "could not import ${zfspool}"
sleep 5
if [ $($sshextern zpool list | grep $zfspool | grep -c "ONLINE") -ne 1 ]; then
echo "${zfspool} is not ONLINE after import"
exit $?
fi
else
echo "$zfspool is ONLINE"
fi
# remove old local log (because of mailing logs)
if [ -f "$logpath"/rsync.log ]; then
rm -f "$logpath"/rsync.log
fi
# reset error counter and start rsync
echo "start rsync ..."
i=0 && start_rsync yourstuff /data/yourstuff
# export remote zfs pool, to have it not faulted on next boot
( $sshextern zpool export -f $zfspool && echo "${zfspool} was exported" && sleep 10 ) || echo "could not export ${zfspool}"
# mail
mail -s "[$progname] - rsync running on $(hostname) to $sshhost completed" "$emailto" < "$logpath"/rsync.log && echo "mail was delivered"
# shutdown remote host
ssh "${sshuser}@${sshhost}" -p "$sshport" "shutdown -p now"
Zuletzt bearbeitet:
Ähnliche Themen
- Antworten
- 0
- Aufrufe
- 4K