¿Cómo abrir de forma remota una URL en Firefox en un perfil específico?


9

Tengo varias instancias de Firefox con varios perfiles diferentes ejecutándose. Entre ellos perfiles con los nombres "software" y "prueba".

Estoy tratando de abrir una URL desde un script bash para que se abra en el perfil "prueba", así:

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

Sin embargo, eso lo abre en el perfil "software" de todos modos. ¿Algunas ideas?

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

No, no es un problema de permisos, todos mis directorios de perfil están perfectamente bajo mis permisos:

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# 

Respuestas:


7

Perdón por la respuesta tardía de 3 años, me interesé en este tema hace un momento y encontré esta pregunta.

No encontré una solución documentada en ninguna parte, así que revisé el código fuente y aquí hay una parte muy relevante: http://dxr.mozilla.org/mozilla-central/source/toolkit/xre/nsAppRunner.cpp#1537

Aquí, el nullptr al final de la línea desafortunadamente significa que el argumento del perfil no se pasa a la función SendCommandLine, por lo tanto, no es posible seleccionar la ventana correcta de firefox para enviar el mensaje openurl.

Sin embargo, vemos que se está pasando el nombre de usuario y que se está intiailizando desde la variable de entorno LOGNAME. En base a esto, se me ocurrió la siguiente solución:

  • Envuelvo firefox con este script, llamado firefox.sh:
FOX_PROFILE = facebook
export LOGNAME = errge. $ FOX_PROFILE
/ opt / firefox / firefox -profile ~ / .mozilla_profiles / $ FOX_PROFILES "$ @"
  • cuando se ejecuta por primera vez, inicia una nueva instancia y el directorio ~ / .mozilla_profiles / facebook debe existir,

  • cuando se ejecuta por segunda vez si el perfil de Facebook ya se está ejecutando, se conecta correctamente a él,

  • puede enviar comandos correctamente a múltiples perfiles de ejecución diferentes (por supuesto, debe cambiar el parámetro FOX_PROFILE en la primera línea en los diferentes scripts).

Probé esto con Firefox 26 en Linux y funciona.

Alternativamente, aquí está mi solución completa que puede querer o no usar:

#! / bin / bash

conjunto -e

FOX = / opt / firefox / firefox

MENSAJE = $ @

si [-z "$ FOX_PROFILE"]; entonces
  si [-z "$ {MENSAJE}"]; entonces
    FOX_PROFILE = predeterminado
  más
    FOX_PROFILE = $ (kdialog - default default --menu "- $ {MESSAGE} -" default default google google facebook facebook errge errge spam spam)
  fi
fi
exportar FOX_PROFILE

# Este truco es necesario, porque el envío de línea de comando remoto de Firefox
# ignora el parámetro de perfil. Ver nsAppRunner.cpp: 1505.
export LOGNAME = errge. $ FOX_PROFILE

# Uso de ejecución en segundo plano en lugar de exec, por lo que el comportamiento es
# consistente cuando el perfil ya se está ejecutando y cuando es solo
# empezando.
$ FOX -profile ~ / .mozilla_profiles / $ FOX_PROFILE "$ @"

# Gran éxito.
salida 0

Si ejecuta el script sin ningún parámetro, selecciona automáticamente el perfil predeterminado, pero puede anularlo configurando FOX_PROFILE a mano en su shell. Si se pasa una URL en la línea de comando, siempre solicita un perfil para abrirla, esto se debe a que hago clic principalmente desde mi programa de chat y correo electrónico y en ese caso quiero seleccionar siempre un perfil (google para el calendario spam, facebook para spam de cumpleaños, etc.). Por supuesto, puede cambiar la lógica para que se ajuste a su estilo de uso, esto es solo un ejemplo, el conocimiento importante es el truco LOGNAME.

Y, por supuesto, debe asegurarse de que este script de contenedor sea la única forma de iniciar el navegador en su máquina. Porque si abre un perfil sin el conjunto de LOGNAME correcto, entonces ya no podrá comunicarse con ese perfil. Puse este script como el primero en mi camino a través de múltiples nombres enlazados, como x-www-browser, firefox, sensible-browser y lo puse en la variable de entorno BROWSER también. Cómo hacer esto depende exactamente de su distribución GNU / Linux.


Muchas gracias por esto. Me parece que configurar el perfil no es necesario y que configurar LOGNAME es suficiente para hacer lo correcto.
dset0x

0

Si ya tiene una instancia en ejecución, Firefox la reutilizará. Tratar firefox -no-remote.


¡Pero quiero que reutilice una instancia! Solo uno específico, no uno aleatorio que le guste. Si intenté agregar "-no-remote" a mi comando, obtengo: "Iceweasel ya se está ejecutando, pero no responde. Para abrir una nueva ventana, primero debe cerrar el proceso Iceweasel existente o reiniciar el sistema".
miernik

Ah, eso lo hace más interesante. Me temo que no sé cómo podría hacer eso. IIUC, -no-remote deshabilita "hablar" entre instancias. Esto puede estar muy lejos del objetivo y de la exageración total, pero podría crear una extensión que sondee un archivo central o una cola de URL del servidor y la abra cuando sea para el perfil actual. Luego instala esa extensión en todas sus instancias.
Janmoesen

0

@miemik

"¡Pero quiero que reutilice una instancia! Solo una específica, no cualquiera aleatoria que le guste. Si intenté agregar" -no-remote "a mi comando, obtengo:" Iceweasel ya se está ejecutando, pero no responde. Para abrir una nueva ventana, primero debe cerrar el proceso Iceweasel existente o reiniciar su sistema ".

Tiene un problema de permiso con su directorio de perfil ... verifique el permiso. ¿Lo copió o movió desde otro lugar (partición ... disco ...)?

Solución:

Conviértete en root y ejecuta arriba para ver si se está ejecutando como root. Luego ls -ld en el directorio de perfil (que debe estar debajo de su directorio de inicio con un punto (.) Delante de ellos ... significa que debe usar "ls -al" para verlo.

Verifique otro permiso de ese directorio y cambie en consecuencia.

¡Salud!


Verifiqué los permisos y pegué el resultado en una edición a mi pregunta. No es ese problema.
miernik

0

No va a funcionar La única forma de tener 2 instancias de una aplicación Mozilla ejecutándose es deshabilitando las conexiones remotas a la segunda (generalmente con MOZ_NO_REMOTE = 1). Eso significa que deshabilita la capacidad de comunicarse con otras instancias (como una que crea abrir una nueva página).

Entonces, sus opciones son abrir una nueva aplicación con no remotehabilitado o reutilizar la instancia que permite el acceso remoto.


De hecho funciona, ver la respuesta de errge. ¿Qué quieres decir con que no funcionará ?
pts

0

Debería poder agregar -no-remotesolo a la llamada del perfil de prueba (después de que el perfil de software ya esté abierto) de esta manera:

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

Eso debería permitir que todos los demás enlaces aún se abran en su otro perfil de forma remota.

Si esta solución no funciona, siempre puede ejecutar Firefox como un usuario separado para las pruebas, utilizando sudo -u. Sin embargo, Firefox realmente debería poder manejar esto correctamente con perfiles.


Esta respuesta no puede ser buena porque con el -no-remoteindicador se inicia una nueva instancia de Firefox, y la pregunta requiere reutilizar las instancias existentes de Firefox si ya se están ejecutando.
pts

0

Si ya tiene abierto Mozilla Firefox con el perfil predeterminado o cualquier otro perfil, intente:

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

Probado y funcionó para mí con Mozilla Firefox de 2.xa 12.x


Esta respuesta no puede ser buena porque la línea de comandos no contiene el perfil requerido para usar.
pts

0

La primera vez que inicie una instancia de Firefox con un perfil determinado, use el comando:

firefox -P foo -new-instance

Puede agregar una URL al final del comando anterior para abrirla. Más tarde, cuando desee abrir una URL en esa instancia, puede usar:

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

Si está escribiendo una secuencia de comandos y desea saber si ya hay una instancia que ejecuta ese perfil para ver cuál de los comandos anteriores debe llamarse, puede usar:

firefox -P foo -remote 'ping()'

Probado con Firefox 34 en Linux.

Tenga en cuenta que actualmente hay un error en Firefox que lo hace un error con el mensaje

Error: Failed to send command: 500 command not parseable

si el -remote openurl()comando se realiza sin un tty controlador (p. ej., a partir de un script iniciado por un demonio).

Llegué a este error al iniciar un script desde un archivo .desktop en KDE (por ejemplo, desde un iniciador en el panel), así que tuve que marcar la opción "ejecutar en terminal", lo cual es un poco molesto.


-1

Para el registro, una solución es: en KDE configuramos el navegador predeterminado para que se ejecute con el siguiente comando:

firefox -P "default"

donde "predeterminado" es nuestro perfil que queremos usar cada vez.

Ahora, comenzamos nuestra instancia de Firefox sin argumentos (el iniciador predeterminado de KDE Firefox). Esto abre Firefox normalmente, ahora queremos abrir otro perfil, para hacerlo, hacemos otro lanzador en el editor de menú de KDE:

firefox -ProfileManager -no-remote %u

Esto abre el administrador de perfiles, elegimos qué perfil usar.

Probado en varios perfiles que se ejecutan simultáneamente, cuando hacemos clic en una URL de cualquier aplicación (como un cliente de chat), se abre una nueva pestaña en el perfil que hemos elegido.

Espero que alguien encuentre esto útil :).

No probado en Gnome, pero espero que pueda replicarse.


1
Esto no responde a la pregunta, el OP quiere lanzar Firefox con diferentes perfiles de un script automáticamente.
terdon el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.