comment ouvrir à distance une URL dans Firefox dans un profil spécifique?

9

J'ai plusieurs instances de Firefox avec plusieurs profils différents en cours d'exécution. Parmi eux, des profils avec les noms "logiciel" et "test".

J'essaie d'ouvrir une URL à partir d'un script bash pour l'ouvrir dans le profil "test", comme ceci:

firefox -P "test" http://www.example.org/

Mais cela l'ouvre quand même dans le profil "logiciel". Des idées?

Mozilla / 5.0 (X11; U; Linux x86_64; en-US; rv: 1.9.1.8) Gecko / 20100308 Iceweasel / 3.5.8 (comme Firefox / 3.5.8)

Non, ce n'est pas un problème de permissions, tous mes répertoires de profils sont parfaitement sous mes permissions:

root@przehyba:~/.mozilla# ls -ld firefox/
drwx------ 13 miernik miernik 4096 Mar 11 09:15 firefox/
root@przehyba:~/.mozilla# ls -ld firefox/*
drwxr-xr-x  9 miernik miernik 4096 Mar 12 11:29 firefox/info
-rw-r--r--  1 miernik miernik  560 Mar 11 09:15 firefox/profiles.ini
drwxr-xr-x 10 miernik miernik 4096 Mar 16 11:51 firefox/software
drwxr-xr-x  9 miernik miernik 4096 Mar 11 09:14 firefox/tech
drwxr-xr-x 11 miernik miernik 4096 Mar 15 22:48 firefox/test
root@przehyba:~/.mozilla# 
miernik
la source

Réponses:

7

Désolé pour la réponse tardive de 3 ans, je me suis intéressé à ce sujet tout à l'heure et j'ai trouvé cette question.

Je n'ai trouvé aucune solution documentée nulle part, j'ai donc vérifié le code source et voici une partie très pertinente: http://dxr.mozilla.org/mozilla-central/source/toolkit/xre/nsAppRunner.cpp#1537

Ici, le nullptr à la fin de la ligne signifie malheureusement que l'argument de profil n'est pas transmis à la fonction SendCommandLine, il n'est donc pas possible de sélectionner la fenêtre firefox correcte pour envoyer le message openurl.

Cependant, nous voyons que le nom d'utilisateur est passé et que le nom d'utilisateur est intiailized à partir de la variable d'environnement LOGNAME. Sur cette base, j'ai trouvé la solution suivante:

  • J'enveloppe firefox avec ce script, appelé firefox.sh:
FOX_PROFILE = facebook
export LOGNAME = errge. $ FOX_PROFILE
/ opt / firefox / firefox -profile ~ / .mozilla_profiles / $ FOX_PROFILES "$ @"
  • lors de sa première exécution, il démarre une nouvelle instance et le répertoire ~ / .mozilla_profiles / facebook doit exister,

  • lors de sa deuxième exécution si le profil facebook est déjà en cours d'exécution, il s'y connecte correctement,

  • il peut envoyer des commandes correctement à plusieurs profils d'exécution différents (bien sûr, vous devez modifier le paramètre FOX_PROFILE dans la première ligne des différents scripts).

J'ai testé cela avec Firefox 26 sur Linux et cela fonctionne.

Alternativement, voici ma solution à part entière que vous souhaiterez ou non utiliser:

#! / bin / bash

set -e

FOX = / opt / firefox / firefox

MESSAGE = $ @

if [-z "$ FOX_PROFILE"]; puis
  if [-z "$ {MESSAGE}"]; puis
    FOX_PROFILE = par défaut
  autre
    FOX_PROFILE = $ (kdialog --default default --menu "- $ {MESSAGE} -" default default google google facebook facebook errge errge spam spam)
  Fi
Fi
exporter FOX_PROFILE

# Ce hack est nécessaire, car l'envoi de la ligne de commande à distance de Firefox
# ignore le paramètre de profil. Voir nsAppRunner.cpp: 1505.
export LOGNAME = errge. $ FOX_PROFILE

# Utiliser l'exécution en arrière-plan au lieu de exec, donc le comportement est
# cohérent lorsque le profil est déjà en cours d'exécution et lorsqu'il est juste
# démarrage.
$ FOX -profile ~ / .mozilla_profiles / $ FOX_PROFILE "$ @"

# Énorme succès.
sortie 0

Si vous exécutez le script sans aucun paramètre, il sélectionne automatiquement le profil par défaut, mais vous pouvez le remplacer en définissant FOX_PROFILE à la main dans votre shell. Si une URL est passée dans la ligne de commande, elle demande toujours un profil dans lequel l'ouvrir, c'est parce que je clique principalement à partir de mon programme de chat et de messagerie et dans ce cas, je veux toujours sélectionner un profil (google for calendar spam, facebook pour anniversaire spam, etc.). Bien sûr, vous pouvez modifier la logique pour l'adapter à votre style d'utilisation, ce n'est qu'un exemple, la connaissance importante est l'astuce LOGNAME.

Et bien sûr, vous devez vous assurer que ce script wrapper est le seul moyen de démarrer le navigateur sur votre machine. Parce que si vous ouvrez un profil sans l'ensemble LOGNAME correct, vous ne pourrez plus communiquer avec ce profil. J'ai mis ce script en premier sur mon chemin via plusieurs noms liés par des liens symboliques, comme x-www-browser, firefox, sensible-browser et je l'ai également placé dans la variable d'environnement BROWSER. Comment faire cela dépend exactement de votre distribution GNU / Linux.

se tromper
la source
Merci beaucoup pour cela. Il me semble que la définition du profil n'est pas nécessaire et que la définition de LOGNAME suffit pour faire la bonne chose.
dset0x
0

Si vous avez déjà une instance en cours d'exécution, Firefox la réutilisera. Essayez firefox -no-remote.

janmoesen
la source
Mais je veux qu'il réutilise une instance! Seulement un spécifique, pas un aléatoire qu'il aime. Si j'ai essayé d'ajouter "-no-remote" à ma commande, j'obtiens: "Iceweasel est déjà en cours d'exécution, mais ne répond pas. Pour ouvrir une nouvelle fenêtre, vous devez d'abord fermer le processus Iceweasel existant ou redémarrer votre système."
miernik
Ah, ça le rend plus intéressant. J'ai bien peur de ne pas savoir comment vous pourriez faire ça. IIUC, -no-remote désactive la "conversation" entre les instances. Cela peut être bien loin de la cible et de la surpuissance totale, mais vous pouvez créer une extension qui interroge un fichier central ou une file d'attente d'URL de serveur et l'ouvre lorsqu'elle est destinée au profil actuel. Vous installez ensuite cette extension dans toutes vos instances.
janmoesen
0

@miemik

"Mais je veux qu'il réutilise une instance! Seule une spécifique, pas une aléatoire qu'il aime. Si j'ai essayé d'ajouter" -no-remote "à ma commande, j'obtiens:" Iceweasel est déjà en cours d'exécution, mais ne répond pas. Pour ouvrir une nouvelle fenêtre, vous devez d'abord fermer le processus Iceweasel existant ou redémarrer votre système. "

Vous avez un problème d'autorisation avec votre répertoire de profil ... vérifiez l'autorisation. L'avez-vous copié ou déplacé depuis un autre endroit (partition..disk ..)?

Solution:

Devenez root et exécutez top pour voir s'il fonctionne en tant que root. Ensuite, ls -ld sur le répertoire de profil (qui devrait être sous votre répertoire d'accueil avec un point (.) Devant eux. Signifie que vous devez utiliser "ls -al" pour le voir.

Vérifiez les autres autorisations de ce répertoire et modifiez-les en conséquence.

À votre santé!

unixbhaskar
la source
J'ai vérifié les autorisations et collé le résultat dans une modification à ma question. Ce n'est pas ce problème.
miernik
0

Ça ne marchera pas. La seule façon d'avoir 2 instances d'une application Mozilla en cours d'exécution est de désactiver les connexions distantes à la seconde (généralement avec MOZ_NO_REMOTE = 1). Cela signifie que vous désactivez sa capacité à communiquer avec d'autres instances (comme celle qui crée l'ouverture d'une nouvelle page).

Vos choix sont donc soit d'ouvrir une nouvelle application avec no remoteactivé, soit de réutiliser l'instance qui autorise l'accès à distance.

jneves
la source
Cela fonctionne en effet, voir la réponse de errge. Que voulez-vous dire par cela ne fonctionnera pas ?
pts
0

Vous devriez pouvoir ajouter le -no-remoteà l'appel de profil de test uniquement (une fois que le profil logiciel est déjà ouvert) comme ceci:

firefox -P "test" -no-remote http://www.example.org/

Cela devrait permettre à tous les autres liens de s'ouvrir à distance dans votre autre profil.

Si cette solution ne fonctionne pas, vous pouvez toujours exécuter Firefox en tant qu'utilisateur distinct pour les tests, en utilisant sudo -u. Firefox devrait vraiment être capable de gérer cela correctement avec des profils.

Trey Hunner
la source
Cette réponse ne peut pas être bonne, car avec l' -no-remoteindicateur, une nouvelle instance de Firefox est démarrée et la question nécessite de réutiliser les instances de Firefox existantes si elles sont déjà en cours d'exécution.
pts
0

Si Mozilla Firefox est déjà ouvert avec le profil par défaut ou tout autre profil, essayez:

Path-To/firefox -remote openurl("http://www.example.org")

Testé et travaillé pour moi avec Mozilla Firefox de 2.x à 12.x

Ipers
la source
Cette réponse ne peut pas être bonne car la ligne de commande ne contient pas le profil requis à utiliser.
pts
0

La première fois que vous démarrez une instance de Firefox avec un profil donné, utilisez la commande:

firefox -P foo -new-instance

Vous pouvez ajouter une URL à la fin de la commande ci-dessus pour l'ouvrir. Plus tard, lorsque vous souhaitez ouvrir une URL dans cette instance, vous pouvez utiliser:

firefox -P foo -remote 'openurl(http://www.example.org)'

Si vous écrivez un script et que vous souhaitez savoir s'il existe déjà une instance exécutant ce profil pour voir laquelle des commandes ci-dessus doit être appelée, vous pouvez utiliser:

firefox -P foo -remote 'ping()'

Testé avec Firefox 34 sous Linux.

Notez qu'il y a actuellement un bogue dans Firefox qui fait qu'il y a une erreur avec le message

Error: Failed to send command: 500 command not parseable

si la -remote openurl()commande est faite sans tty de contrôle (par exemple, à partir d'un script démarré par un démon).

J'ai rencontré ce bogue lors du lancement d'un script à partir d'un fichier .desktop dans KDE (par exemple, à partir d'un lanceur dans le panneau), j'ai donc dû cocher l'option "exécuter dans le terminal", ce qui est un peu ennuyeux.

bauermann
la source
-1

Pour mémoire, une solution est la suivante: dans KDE, nous configurons le navigateur par défaut pour qu'il s'exécute avec la commande suivante:

firefox -P "default"

où "par défaut" est notre profil que nous voulons utiliser à chaque fois.

Maintenant, nous démarrons notre instance Firefox sans arguments (le lanceur par défaut de KDE Firefox). Cela ouvre Firefox normalement, maintenant nous voulons ouvrir un autre profil, pour ce faire, nous faisons un autre lanceur dans l'éditeur de menu de KDE:

firefox -ProfileManager -no-remote %u

Cela ouvre le gestionnaire de profils, nous choisissons le profil à utiliser.

Testé sur plusieurs profils exécutés simultanément, lorsque nous cliquons sur une URL depuis n'importe quelle application (comme un client de chat), un nouvel onglet est alors ouvert dans le profil que nous avons choisi.

J'espère que quelqu'un trouve cela utile :).

Non testé sur Gnome, mais j'espère qu'il pourra être répliqué.

Damjan Dimitrioski
la source
1
Cela ne répond pas à la question, l'OP veut lancer automatiquement Firefox avec différents profils à partir d'un script.
terdon