WinSCP Berechtigungsfehler ignorieren

Überträgt man mit WinSCP Dateien auf einen Linux Host so erhält man dort die Meldung “Fehlernachricht vom Server : Permission denied” bzw. “Permission denied Error Code 3” die im Detail wie folgt aussieht:

Das Hochladen der Datei 'php.ini' war erfolgreich, aber es trat ein Fehler beim Setzen der Berechtigungen und/oder der Dateizeit auf.

Wenn das Problem weiterbestehen bleibt, schalten Sie die Option 'Berechtigungsfehler ignorieren' ein.

Erlaubnis verweigert.
Fehlercode: 3
Fehlernachricht vom Server : Permission denied

Man kann diesen Fehler ignorieren, da dies ein programminterner Fehler von WinSCP ist, welcher unter Filezilla und auch mit anderen Übertragungstools nicht auftritt. Die Datei wurde erfolgreich auf dem Host übertragen  und es wird lediglich das Ergebnis vom Client falsch ausgewertet.

Lösung

Öffne im Menü Einstellungen im Unterpunkt

   Menü -> Einstellungen (Strg + Alt + P ) -> Übertragung

 

und bearbeite dort alle Profile indem Du unter Upload Optionen die Checkbox der Option Berechtigungsfehler ignorieren aktivierst.

bzw. im englischsprachigen Editor

  Menü -> Settings (Strg + Alt + P ) -> Transfer

und dort die Profile via “Edit” alle Profile bearbeiten und unter Upload options die Checkbox der Option Ignore permission errors aktiviert.

Weiterführende Literatur

Verzeichnis unter Linux beobachten

Möchte man unter Linux ein Verzeichnis in Echtzeit beobachten eignet sich hierfür folgender Befehl:

watch -n 1 "ls -latr"

Hiermit wird im Sekundentakt der Verzeichnisinhalt des aktuellen Arbeitsverzeichnis ausgelesen und in umgekehrter Reihenfolge der zuletzt geänderten Dateien nach ausgegeben.

Wem das dann noch immer nicht Realtime genug ist, der kann den Parameter -n mit der Angabe 0.1 auf 100ms herunterbrechen und Order somit Realtime beobachten. Achtung – dies geht je nach Rechnerleistung auf die Performance des Gesamtsystems.

 

Blockierende Prozesse unter Linux anzeigen

Manchmal hat man unter Linux das Phänomen, dass bestimme Prozesse das System blockieren und auf andere Prozesse, Daten oder Dienste warten. Möchte man derartige aktuell blockierende Prozesse unter Linux finden kann man sich dem nachfolgendem Befehl bedienen:

ps auxf | awk "\$8 ~ /D/ { print \$0 }"

Will man darüber hinaus auch den Verlauf in Echtzeit beobachten kann man diesen mittels watch erweitern:

watch -n 1 '(ps auxf | awk "\$8 ~ /D/ { print \$0 }")'

Aktive Internetverbindungen

netstat listet als Kommandozeilenprogramm sämtliche Verbindungen der Netzwerkschnittstelle.

Um alle TCP Verbindungen am angemeldeten System anzuzeigen bietet netstat die Optionen -pute an. Dadurch wird es möglich alle die gegenwärtig aktiv übertragenden Verbindungen anzuzeigen welche gegenwärtig tätig sind oder er bis vor wenigen Sekunden gewesen sind.

vader@deathstar:~$ netstat -pute

Aktive Internetverbindungen (ohne Server)

Proto Rec Snd Local Address           Foreign Address         State
tcp     0   0 localhost:53912         localhost:zabbix-agent  TIME_WAIT
tcp     0   0 localhost:zabbix-agent  localhost:53924         TIME_WAIT
tcp     0  64 mail.deathstar.de:imaps cable-87-78-245-2:50719 VERBUNDEN
tcp     0   0 localhost:zabbix-agent  localhost:53938         TIME_WAIT

Lässt man nun die Verbindungen in einem separaten Screen laufen kann man mittels dem folgenden Befehl eine Echtzeitüberwachung der Verbindungen zur lokalen Maschine durchführen und in einem separaten Tab anzeigen:

watch -n 1 netstat -pute

Originaldatei nach Komprimierung mit gzip erhalten

Wenn man Dateien mittels gzip komprimiert wird die Quelldatei anschließend gelöscht. Es gibt in gzip dafür auch keinen Schalter um das zu verhindern. Man kann sich jedoch einem kleinen Kniff behelfen. Indem man nun die Ausgabe von gzip mittels der Option -c nach STDOUT umleitet wird die Eingabedatei nicht gelöscht.

gzip -c source.txt > source.txt.gz

Das gleiche Prinzip gilt nun für den Rückweg um eine komprimierte Datei beizubehalten:

gunzip -c source.txt.gz > source.txt

Fazit

Linux Pipes sind oftmals die elegante Lösung um Probleme zu lösen, die mit komplizierten Optionen vom Anwender gesucht oder sogar vom Entwickler gelöst werden.

Releasewechsel in PHP

Offensichtlich stellt die Auslieferung ein neuen Releases in einigen PHP-Projekten einen hohen manuellen Aufwand dar, da Dateien über die bestehende Installation mehr oder weniger manuell kopiert werden. Dabei müssen selbstverständlich zu löschende Dateien und Ordner berücksichtigt werden, sowie ist darüber hinaus dieser Vorgang nur vorwärtsgerichtet und kann im Falle eines massiven Fehlers nur zurückgerollt werden sofern eine Komplettsicherung vorliegt.
Zu guter Schluss kann dieser manuelle Vorgang mehrere Minuten bis sogar Stunden in Anspruch nehmen und damit eine längere Downtime der Webseite bzw. des Services einfordern. Je nach Projekt kann dies unerwünscht und in Folge dessen auch noch mit hohen Kosten verbunden sein – zum einen durch Personalkosten sowie zum anderen der Nichtverfügbarkeit und dem damit verbundenen Nutzungsausfall. Wer zur Krönung dann noch eine ganze Farm von installierten Applikationen zu aktualisieren hat wird letztlich seinen Aufwand nochmal um die Anzahl der Hosts multiplizieren dürfen.

In diesem Sinne: Prost Mahlzeit!

Releasewechsel in PHP weiterlesen

Dateirechte auf andere Dateien übertragen

Man kann unter Linux die Dateirechte mittels chmod relativ einfach setzen.

Wenn man nun jedoch die Berechtigungen einer Datei als Ausgangsbasis nehmen möchte so kann man dies Mittels dem Parameter –reference ganz simpel durchführen.

Gehen wir von folgendem Stand im aktuellen Verzeichnis aus:

vader@deathstar:~/test/$ ls -l
-rwxrwxrwx 1 vader users 0 Mär 16 17:54 source.txt
-rw-rw-r-- 1 vader vader 0 Mär 16 17:54 target.txt

Führe ich nun folgenden Befehl aus:

chmod --reference source.txt target.txt

ändern sich die Berechtigungen wie folgt:

vader@deathstar:~/test/$ ls -l
-rwxrwxrwx 1 vader users 0 Mär 16 17:54 source.txt
-rwxrwxrwx 1 vader vader 0 Mär 16 17:54 target.txt

Hier sieht man nun, dass die Berechtigungen des Benutzers, der Gruppe sowie für Everyone übernommen wurden und mit denen der Quelldatei restlos übereinstimmen.

Das ganze kann auch auf beliebig vielen Dateien angewandt werden:

chmod -R --reference source.txt target1.txt target2.txt

Sowie auf Dateien die einem gewünschten Zielmuster entsprechen:

chmod -R --reference source.txt target*

und in besonders harten Situationen sogar rekursiv:

chmod -R --reference source.txt ~/somewhere_else

Und wie kann es anders sein, ist dies auch mit dem Befehl chown auf die selbe Art und Weise möglich um anstelle dessen auch die Gruppen und Benutzerinformationen zu setzen:

vader@deathstar:~/test/$ ls -l
-rwxrwxrwx 1 vader users 0 Mär 16 17:54 source.txt
-rwxrwxrwx 1 vader vader 0 Mär 16 17:54 target.txt

Führe ich nun folgenden Befehl aus:

chown --reference source.txt target.txt

ändern sich die Berechtigungen wie folgt:

vader@deathstar:~/test/$ ls -l
-rwxrwxrwx 1 vader users 0 Mär 16 17:54 source.txt
-rwxrwxrwx 1 vader users 0 Mär 16 17:54 target.txt

Anwendungsbeispiel

Dies kann nun zum Beispiel dort angewandt werden wo Dateien einem Webserver hinzugefügt wurden. Die Berechtigungen dieser Dateien werden sodann dem aktuellen Benutzer zugeordnet und können nun mit einer bestehenden Referenzdatei in einem Rutsch mit den beiden oben genannten Befehlen gesetzt werden ohne die Berechtigungen explizit anzugeben oder mühsam herauszusuchen.

Aktuell laufende Prozesse unter Linux anzeigen

Um eine Liste der aktuell laufenden Prozesse unter Linux anzuzeigen kann man sich ps mit folgenden Schaltern zu Hilfe nehmen:

[vader@deathstar]$ ps -dF r | grep -v "ps -dF r"

Durch das weitere Anhängen des grep Befehls wird der eigene Prozess in der Liste dabei ausgeblendet. Dies liefert sodann eine ausführliche Ausgabe der laufenden Prozesse die im gegenwärtigen Augenblick die CPU beanspruchen wie folgt:

UID PID PPID C SZ RSS PSR STIME TTY STAT TIME CMD
vader 8425 7798 65 83356 39364 11 21:07 pts/0 R+ 0:18 php laser_attack.php
vader 8519 1750 62 79953 25940 19 21:08 pts/0 R+ 0:15 php shield.php

Wer nun auch noch in einer separaten screen-Session dies in Echtzeit verfolgen möchte kann dies mittels watch unter Beobachtung stellen:

[vader@deathstar]$ watch -n 0.5 'ps -dF r | grep -v "ps -dF r"'

Linux Befehle auf der bash wiederholen

Man kann zum Bespiel damit x-mal den gleichen Befehl absetzen:

vader@deathstar:~$ for i in {1..10}; do $YOUR_COMMAND$; done

Zum Beispiel um eine definierte Menge Requests an eine Domain abzufeuern und dies nicht mehrfach manuell zu wiederholen:

vader@deathstar:~$ for i in {1..5}; do curl 'http://moderlak.de/feed/'; done

Man kann das auch unendlich tun indem man den Befehl watch sich zu Hilfe nimmt:

vader@deathstar:~$ watch -n 1 curl 'http://blog.moderlak.de/feed/'

Das man nun damit keinen Unfug anstellt sei doch zum Abschluss noch deutlich genannt und gilt hiermit als klargestellt.

Diese Beispiele sind ganz klar vor allem für Testzwecke gedacht um die Performance seiner eigenen Seite unter Last zu beobachten. So könnte man zu Beispiel in einer screen-Session mehrere verschiedene Aufrufe parallelisieren und damit seine Webseite befeuern.

Suche nach Dateien deren Datum älter als Mitternacht

Manchmal möchte man nach sich unter Linux Dateien anzeigen lassen, die am heutigen Tag seit Mitternacht erzeugt wurden. find unterstüzt einen dahingehend nicht mit einem Parameter bei dem man konkret ein Datum mitgeben kann. Man kann sich damit aushelfen indem man mit einer Referenzdatei agiert die Anhand ihres Erzeugungsdatum verglichen wird.

Dies ist in einem dreischrittigen Prozess möglich. Dazu erzeuge ich eine temporäre Datei, deren Erzeugungdatum ich auf Beginn des gegenwärtigen Tages manipuliere. Anschließend starte ich die Suche in der ich alle Dateien ermittle welche neuer sind als die soeben erzeugte. Abschließend wird diese temporöre Datei wieder gelöscht.

touch -t `date +%m%d0000` /tmp/$$
find -maxdepth 1 -newer /tmp/$$
rm /tmp/$$

Das ganze könnte in einem globalen Shell-Skript gepackt noch etwas eleganter aufrufbar werden, beschränkt dann allerdings die Verwendung von find auf die dortige Implementierung ein.