Verhindern Sie, dass Nautilus die im Bash-Skript gemountete Partition anzeigt


8

In meinem Bash-Skript mounte ich Partitionen, überprüfe sie, kopiere Dateien darauf und hebe die Bereitstellung auf. Wenn das Skript die Partition bereitstellt, wird Nautilus mit einem Fenster angezeigt, in dem die Partition angezeigt wird und der Fokus gestohlen wird. Das möchte ich vermeiden.

Hinweis: Ich weiß, dass ich das Verhalten in den Systemeinstellungen, Details, Never prompt or start programs on media insertionWechselmedien ändern kann , aber ich möchte das Verhalten nicht ändern, z. B. wenn ein USB-Stick angeschlossen ist, ich möchte es nur in meinem Bash-Skript verhindern . Da dieses Skript auf den Computern anderer Benutzer ausgeführt wird, kann ich diese Einstellungen (im Skript) nicht ändern, da bei einer abnormalen Beendigung die geänderten Einstellungen beibehalten werden (ich glaube auch nicht, dass dies erforderlich sein sollte).

Eigentlich scheint diese automatische Anzeige nicht konsistent zu sein. Wenn ich genau den gleichen Befehl vom Terminal aus ausführe, wird Nautilus nicht angezeigt, und ich weiß, dass in meinem Skript andere Bereitstellungen nicht angezeigt werden. Was könnte das verursachen? Hier ist ein Beispiel für den Code (beide führen dazu, dass separate Nautilusfenster geöffnet werden):

mount $dev $target
mkdir -p $target/home
mount $homedev $target/home

Ich bin daran interessiert zu verstehen, wie der Mount Nautilus signalisiert und warum dies geschieht (wenn dies nicht der Fall ist, wenn ich die Partition vom Terminal aus mounte). Und was ist der beste Weg, um dies zu verhindern?

Ich habe dieses Verhalten ab Release 11.10 bemerkt (wenn ich mich richtig erinnere). Ich verwende derzeit 12.04, aber das Skript muss auf allen unterstützten Versionen funktionieren. Ich glaube nicht, dass die Lösung das Ändern von Systemeinstellungen beinhalten sollte (die zwischen den Releases unterschiedlich sein können). Wenn Sie sich beispielsweise andere Dinge ansehen, die Partitionen bereitstellen (z. B. os-prober), werden keine Nautilus-Fenster angezeigt, wenn verschiedene Partitionen bereitgestellt werden.

Das Skript finden Sie hier . Und hier ist der Teil, in dem Nautilus auftaucht. Ich denke, dass es auch hier auftaucht , aber ich habe meine Tests auf den ersten Link konzentriert. Hier wird es nicht angezeigt, vor diesen anderen Reittieren aufgerufen. Beachten Sie, dass ich die ersten als - Nur Lesen und innerhalb einer if-Anweisung umgeschrieben habe und es keinen Unterschied macht.

Im Idealfall erklärt die Antwort, warum dies geschieht und wie dies verhindert werden kann, mit anderen Worten, warum das In-Script mountanders behandelt wird als das von einem Terminal ausgegebene. Eine gute Problemumgehung wird auch akzeptiert, wenn es sich um eine vollständig erläuterte und praktische Lösung handelt, die alle Desktop-Umgebungen (Ubuntu, Kubuntu, Xubuntu, Lubuntu usw.) unterstützt. Ich möchte auch eine exponentielle Zunahme der Tests vermeiden, um dies zu überprüfen.

Danke im Voraus

============

Lösung gemäß Papashou -Link:

add_udev_rules ()
{
    for i in "$dev" "$homedev" "$bootdev" "$usrdev"; do
      if [ -n "$i" ]; then
        block=${i#/dev/}
        echo "KERNEL==\"""$block""\",ENV{UDISKS_PRESENTATION_HIDE}=\"1\"" >> "$wubi_move_dir"/wubi_move.rules
      fi
    done
    cp "$wubi_move_dir"/wubi_move.rules /etc/udev/rules.d/wubi_move.rules
    udevadm trigger > /dev/null 2>&1
}

remove_udev_rules ()
{
    rm /etc/udev/rules.d/wubi_move.rules
    rm "$wubi_move_dir"/wubi_move.rules
    udevadm trigger > /dev/null 2>&1
}

Dies erzielt das gewünschte Ergebnis, fühlt sich jedoch wie ein Vorschlaghammer an. Ich glaube, es gibt wahrscheinlich eine Feinabstimmung in udev, die es der Partition ermöglicht, weiterhin in Nautilus (und anderen Dateibrowsern) angezeigt zu werden, ohne dass sie beim Mounten auftaucht. Übrigens, wenn jemand dies versuchen möchte, zeigt das folgende Skript den Popup-Effekt von Nautilus:

mkdir -p /tmp/testmount
mount /dev/sda1 /tmp/testmount
sleep 3
umount /dev/sda1 
mount /dev/sda1 /tmp/testmount
sleep 3
umount /dev/sda1 
mount /dev/sda1 /tmp/testmount
sleep 3
umount /dev/sda1 
mount /dev/sda1 /tmp/testmount
sleep 3
umount /dev/sda1 
rmdir /tmp/testmount

Ich werde weiter spielen udevund habe auch einen Fehler gemeldet , da dies für eine Partition, die nicht eingesetzt ist, keinen Sinn macht, sich beim Mounten wie eine eingesteckte USB- / Medienkarte zu verhalten. Auch udevadm triggerist dies keine kostengünstige Operation, die (zumindest am 12.04.) Erscheint, um alles vorübergehend einzufrieren.

Zusammenfassend habe ich also eine praktikable Lösung (danke an alle, die mitgeholfen haben), die ich möglicherweise implementieren kann oder nicht (noch nicht sicher); aber ich werde weiter nach etwas anderem suchen. Vielen Dank


Könnten Sie für andere, die antworten, Ihre Ubuntu-Version hinzufügen? zB 9.04, 10.10, 12.04. Es gab ein gutes Stück Evolution von einem zum anderen.
Paul

Guter Punkt. Ich werde meine Frage bearbeiten, um das hinzuzufügen.
bcbc

Wenn Sie -i besteigen, verhindert es, dass Nautilus auftaucht? Es funktioniert für mich, um zu verhindern, dass Gnome-Shell mit dem kleinen Dialog am unteren Bildschirmrand auftaucht. Dies wurde unter 12.04 Ubuntu mit Gnome-Shell getestet.
Gary

Das macht für mich keinen Unterschied.
bcbc

<p> _Wenn ich genau den gleichen Befehl vom Terminal aus ausführe, wird Nautilus nicht angezeigt_ - Wie starten Sie Ihr Skript? </ p> <p> und ich weiß, dass es andere Reittiere in meinem Skript gibt, die nicht
anzeigen

Antworten:


3

Versuchen Sie diesen Vorschlag: http://www.worldofnubcraft.com/969/hide-your-disks-or-partitions-from-nautilus/

Ich bin mir ziemlich sicher, dass es mit udev-Signalen und der Verarbeitung zu tun hat.


3
Können Sie den Inhalt des Links hier kurz posten? Eine Antwort mit nur einem Link ist in der AU-Community nicht sehr willkommen.
Mahesh

Das funktioniert. Im Moment gibt es zu wenig Details, um die Antwort zu akzeptieren. Ich habe manuell bestätigt, dass es funktioniert, um die Datei zu erstellen und aufzurufen udevadm trigger. Ich möchte nur bestätigen, dass es im Skript funktioniert. Ich werde die Details in der Frage posten, wenn Sie hier nicht mehr hinzugefügt haben.
bcbc

Ich wollte nicht noch einmal zusammenfassen, was der Link bereits klar dargelegt hat. Grundsätzlich muss in /etc/udev/rules.d/ eine Regel hinzugefügt werden, die udev anweist, bestimmte Geräte nicht zu verarbeiten. Jedes Gerät erhält eine eigene Zeile mit folgenden Angaben: KERNEL == ”sda1 ″, ENV {UDISKS_PRESENTATION_HIDE} =” 1 ″. Dadurch wird kein System- oder Kernelverhalten geändert. Es weist UDEV lediglich an, die Darstellung der Festplatte auszublenden. Nautilus verlässt sich für genau dieses Verhalten auf die Verarbeitung von udev-Regeln.
Papashou

1

Versuchen Sie, Ihr Skript zu verpacken:

#!/bin/bash
#

# disable nautilus automount
#
gconftool --type Boolean --set /apps/nautilus/preferences/media_automount  false

# put your script here  
#
...

# enable back nautilus automount
# 
gconftool --type Boolean --set /apps/nautilus/preferences/media_automount  true

Nicht getestet, da ich am 10.04 bin

AKTUALISIEREN:

#!/bin/bash
#

# disable nautilus automount
#
gconftool --type Boolean --set /apps/nautilus/preferences/media_automount  false

# put CALLING your script here to survive its crashes
#
/bin/bash -c "/whenever/it/is/placed/script.sh"

# enable back nautilus automount
# 
gconftool --type Boolean --set /apps/nautilus/preferences/media_automount  true

Vielen Dank für den Vorschlag ... Ich möchte die Einstellungen nicht ändern, da ich nicht sicher bin, ob sie sofort wirksam werden. Für jede Version ist ein anderer Code erforderlich. Sie ist unelegant. Wenn das Skript abgebrochen wird, verlässt sie den Benutzer in einem unerwünschten Zustand - ich glaube auch nicht, dass es notwendig sein sollte. Was ich suche, ist der Mechanismus, mit dem Nautilus über das Reittier informiert wird und wie man es umgeht. zB udev? dbus? diese Art von Ding.
bcbc

+ Ich möchte die Einstellungen nicht ändern, da ich nicht sicher bin, ob sie sofort wirksam werden. Dies ist die Frage, die überprüft werden muss (einfach genug). + es erfordert für jede Version einen anderen Code - es kann 50 | 50 erfordern oder nicht, als ob ich einen Prüfstand auf der Straße treffen könnte)) + es ist unelegant - im Vergleich zu welcher Alternative?
zuba

+ Wenn das Skript abgebrochen wird, bleibt der Benutzer in einem unerwünschten Zustand - viele Pakete (z. B. Eignung) tun dies, wenn sie abgebrochen werden. Es gibt Ansätze, um diese Nebenwirkung zu vermeiden. Sie können beispielsweise cron aufladen, um alle 1 Minute zu überprüfen, ob das Skript ausgeführt wird, und um die Einstellung nicht zurückzusetzen. Oder Sie können Ihr Skript von einem anderen ausführen, der die Einstellung steuert.
zuba

Mein Punkt ist, dass es nicht erforderlich sein sollte, eine Desktop-spezifische Einstellung zu ändern. Ich hätte auch hinzufügen sollen, dass dieses Skript unter Ubuntu / Xubuntu / Kubuntu / Lubuntu usw. ausgeführt werden kann, wodurch ein hohes Maß an Komplexität und Risiko entsteht.
bcbc

Die Alternative, die Partition mit udisk auf die schwarze Liste zu setzen (siehe papashous link), erfordert sudo und ist nicht maschinenübergreifend portierbar, sodass sie noch komplexer und riskanter wäre.
Egil

1

Sie können die automatische Bereitstellung von Flash-Laufwerken verhindern, indem Sie eine neue udev-Regel hinzufügen. In dieser Regel können Sie ein Flash-Laufwerk anhand seines Herstellers, seiner Seriennummer und anderer Attribute angeben. Siehe ATTRS {} -Zeilen in der Ausgabe von:

udevadm info -a --name=sdb1

Dieses Skript sollten Sie in den Ordner /etc/udev/rules.d mit einem speziellen Dateinamen ablegen , z. B. 81-usb-wubi-move.rules

Die Regel könnte so aussehen

ACTION=="add", KERNEL=="sdb?", SUBSYSTEMS=="usb", ATTRS{serial}=="001CC07CEE5EFB91C91B235C", ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_PRESENTATION_NOPOLICY}="1"

Siehe auch:


Dies scheint eine mögliche Problemumgehung zu sein - ich brauche Zeit, um dies zu überprüfen und zu experimentieren, und werde erst später heute eine Chance haben (werde dann Feedback geben). Im Idealfall erklärt die Antwort, warum dies geschieht (im Vergleich zum Laufen mountvom Terminal), aber wenn ich eine gute Problemumgehung bekomme, werde ich das auch akzeptieren.
bcbc

Dies ist der eine
RobotHumans

0

Ungetestet ... nur eine Ahnung.

Hängen Sie das Dateisystem in einen Baum ein, auf den der Nautilus-Benutzer nicht zugreifen kann, z. B. in einem Unterverzeichnis von / root oder / home / Someoneelse oder einem / tmp-Unterverzeichnis, das einer anderen Person gehört und von dieser gesichert wird

Beachten Sie, dass es möglicherweise eine schlechte Idee ist, dasselbe Hardwaregerät an zwei Mountpunkten zu mounten und von beiden zu ändern.

Einige menschliche Konfigurationen sind unter (12.04beta) Ubuntu-> Systemeinstellungen-> Details-> Wechselmedien möglich. Einige der Optionen können auf "nichts tun" gesetzt werden, wodurch das Popup möglicherweise vermieden wird.

Die Dokumentation unter https://help.ubuntu.com/community/Mount/USB ist möglicherweise hilfreich für 9.10, funktioniert jedoch nicht mit 12.04. Die genannten Schlüssel für den gconf-Editor werden nicht mehr verwendet.


Es wird in einem Verzeichnis unter / tmp (und nirgendwo anders) bereitgestellt.
bcbc

Der angemeldete Benutzer kann jedoch weiterhin auf / tmp zugreifen. Der Vorschlag war, ein Verzeichnis zu verwenden, auf das der angemeldete Benutzer nicht zugreifen kann.
Paul

Ich habe chmod 700das Verzeichnis verwendet ... sah vielversprechend aus und öffnete dann ein Nachrichtenfenster (ohne Fenstertitel): "Ordner für 10-GB-Dateisystem kann nicht geöffnet werden", "Keine Anwendung ist für die Verarbeitung dieser Datei registriert"
bcbc

Faszinierend. Es ist sehr anstrengend. Vielleicht habe ich später Zeit, damit zu spielen.
Paul

0

Versuchen Sie es mountmit den -nund -iFlags.


Ich habe das versucht - so ziemlich alle Mount-Optionen durchlaufen, die ich kann. Der Auslöser geschieht woanders.
bcbc
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.