como abrir remotamente um URL no Firefox em um perfil específico?


9

Eu tenho várias instâncias do Firefox com vários perfis diferentes em execução. Entre eles perfis com os nomes "software" e "teste".

Estou tentando abrir uma URL a partir de um script bash para abri-la no perfil "test", assim:

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

No entanto, isso abre no perfil "software" de qualquer maneira. Alguma ideia?

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)

Não, não é um problema de permissões, todos os meus diretórios de perfil estão perfeitamente sob minhas permissões:

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# 

Respostas:


7

Desculpe pela resposta tardia de três anos, fiquei interessado neste tópico agora e encontrei esta pergunta.

Como não encontrei uma solução documentada em nenhum lugar, verifiquei o código-fonte e aqui está uma parte muito relevante: http://dxr.mozilla.org/mozilla-central/source/toolkit/xre/nsAppRunner.cpp#1537

Aqui, o nullptr no final da linha infelizmente significa que o argumento do perfil não está sendo passado para a função SendCommandLine; portanto, não é possível selecionar a janela correta do firefox para a qual enviar a mensagem de abertura.

No entanto, vemos que o nome de usuário está sendo passado e que ele está sendo desativado a partir da variável de ambiente LOGNAME. Com base nisso, eu vim com a seguinte solução:

  • Eu envolvo o firefox com este script, chamado firefox.sh:
FOX_PROFILE = facebook
exportar LOGNAME = erro. $ FOX_PROFILE
/ opt / firefox / perfil do firefox ~ / .mozilla_profiles / $ FOX_PROFILES "$ @"
  • quando executado pela primeira vez, ele inicia uma nova instância e o diretório ~ / .mozilla_profiles / facebook deve existir,

  • quando executado pela segunda vez, se o perfil do facebook já estiver em execução, ele se conecta corretamente a ele,

  • ele pode enviar comandos corretamente para vários perfis de execução diferentes (é claro que você precisa alterar o parâmetro FOX_PROFILE na primeira linha dos diferentes scripts).

Eu testei isso com o Firefox 26 no Linux e funciona.

Como alternativa, aqui está minha solução completa que você pode ou não querer usar:

#! / bin / bash

set -e

FOX = / opt / firefox / firefox

MESSAGE = $ @

if [-z "$ FOX_PROFILE"]; então
  if [-z "$ {MENSAGEM}"]; então
    FOX_PROFILE = padrão
  outro
    FOX_PROFILE = $ (kdialog - padrão padrão - menu "- $ {MESSAGE} -" padrão padrão google google facebook facebook erro erro erro spam)
  fi
fi
exportar FOX_PROFILE

# Esse hack é necessário, porque o envio remoto da linha de comando do firefox
# ignora o parâmetro profile. Consulte nsAppRunner.cpp: 1505.
exportar LOGNAME = erro. $ FOX_PROFILE

# Usando a execução em segundo plano em vez de exec, para que o comportamento seja
# consistente quando o perfil já está sendo executado e quando é apenas
# Começando.
Perfil de $ FOX ~ / .mozilla_profiles / $ FOX_PROFILE "$ @"

# Enorme sucesso.
saída 0

Se você executar o script sem nenhum parâmetro, ele selecionará automaticamente o perfil padrão, mas poderá substituí-lo configurando FOX_PROFILE manualmente no shell. Se um URL é passado na linha de comando, ele sempre solicita um perfil para abri-lo, é porque eu clico principalmente no meu programa de bate-papo e e-mail e, nesse caso, quero sempre selecionar um perfil (google for calendar spam, facebook para spam de aniversário, etc.). Claro que você pode alterar a lógica para se adequar ao seu estilo de uso; este é apenas um exemplo, o conhecimento importante é o truque LOGNAME.

E é claro que você precisa garantir que esse script de wrapper seja a única maneira de iniciar o navegador em sua máquina. Porque se você abrir um perfil sem o conjunto LOGNAME correto, não poderá mais se comunicar com esse perfil. Coloquei esse script como o primeiro no meu caminho por meio de vários nomes com links simbólicos, como x-www-browser, firefox, sensible-browser e também na variável de ambiente BROWSER. Como fazer isso depende exatamente da sua distribuição GNU / Linux.


Muito obrigado por isso. Parece-me que não é necessário definir o perfil e que definir LOGNAME é suficiente para fazer a coisa certa.
dset0x

0

Se você já tem uma instância em execução, o Firefox reutilizará isso. Tente firefox -no-remote.


Mas quero que reutilize uma instância! Apenas um específico, não um aleatório que ele goste. Se eu tentasse adicionar "-no-remote" ao meu comando, recebo: "O Iceweasel já está em execução, mas não está respondendo. Para abrir uma nova janela, você deve primeiro fechar o processo existente do Iceweasel ou reiniciar o sistema".
miernik

Ah, isso torna mais interessante. Receio não saber como você poderia fazer isso. IIUC, -no-remote desativa "conversação" entre instâncias. Isso pode estar muito fora do objetivo e do excesso de capacidade total, mas você pode criar uma extensão que controla uma fila central de arquivos ou URLs do servidor e a abre quando se destina ao perfil atual. Você instala essa extensão em todas as suas instâncias.
janmoesen

0

@miemik

"Mas eu quero que reutilize uma instância! Somente uma específica, e nenhuma aleatória que ela goste. Se eu tentasse adicionar" -no-remote "ao meu comando, eu recebo:" O Iceweasel já está em execução, mas não está respondendo. Para abrir uma nova janela, você deve primeiro fechar o processo existente do Iceweasel ou reiniciar o sistema. "

Você tem um problema de permissão com o diretório do seu perfil ... verifique a permissão. Você o copiou ou moveu de outro lugar (partição .. disco ..)?

Solução:

Torne-se root e execute o top para ver se está sendo executado como root. Então ls -ld no diretório dir (que deve estar em seu diretório inicial com um ponto (.) Na frente deles .. significa que você precisa usar "ls -al" para vê-lo.

Verifique outra permissão desse diretório e altere de acordo.

Felicidades!


Verifiquei as permissões e colei o resultado em uma edição da minha pergunta. Não é esse problema.
miernik

0

Isso não vai funcionar. A única maneira de ter duas instâncias de um aplicativo Mozilla em execução é desativando as conexões remotas com a segunda (geralmente com MOZ_NO_REMOTE = 1). Isso significa que você desabilita a capacidade de se comunicar com outras instâncias (como a criação de uma nova página).

Portanto, suas escolhas são abrir um novo aplicativo com no remoteativado ou reutilizar a instância que permite acesso remoto.


De fato funciona, veja a resposta do erro. O que você quer dizer com isso não vai funcionar ?
pts

0

Você poderá adicionar a -no-remoteapenas a chamada de perfil de teste (depois que o perfil de software já estiver aberto) assim:

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

Isso deve permitir que todos os outros links ainda sejam abertos remotamente em seu outro perfil.

Se essa solução não funcionar, você poderá sempre executar o Firefox como um usuário separado para teste, usando sudo -u. O Firefox realmente deve ser capaz de lidar com isso corretamente com os perfis.


Essa resposta não pode ser boa porque, com o -no-remotesinalizador, uma nova instância do Firefox é iniciada e a pergunta requer a reutilização das instâncias existentes do Firefox, se elas já estiverem em execução.
pts

0

Se você já possui o Mozilla Firefox aberto com o perfil Padrão ou outro, tente:

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

Testei e trabalhei para mim com o Mozilla Firefox de 2.x a 12.x


Essa resposta não pode ser boa porque a linha de comando não contém o perfil necessário para uso.
pts

0

Na primeira vez que você inicia uma instância do Firefox com um determinado perfil, use o comando:

firefox -P foo -new-instance

Você pode anexar um URL no final do comando acima para abri-lo. Posteriormente, quando você desejar abrir um URL nessa instância, poderá usar:

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

Se você estiver escrevendo um script e quiser descobrir se já existe uma instância executando esse perfil para ver qual dos comandos acima deve ser chamado, você pode usar:

firefox -P foo -remote 'ping()'

Testado com o Firefox 34 no Linux.

Observe que atualmente há um bug no Firefox que faz com que ocorra um erro com a mensagem

Error: Failed to send command: 500 command not parseable

se o -remote openurl()comando for feito sem um tty de controle (por exemplo, a partir de um script iniciado por um daemon).

Eu acertei esse bug ao iniciar um script a partir de um arquivo .desktop no KDE (por exemplo, de um iniciador no painel), então tive que marcar a opção "executar no terminal", o que é um pouco chato.


-1

Para o registro, uma solução é: no KDE, configuramos o navegador padrão para executar com o seguinte comando:

firefox -P "default"

onde "padrão" é o nosso perfil que queremos usar sempre.

Agora, iniciamos nossa instância do Firefox sem argumentos (o iniciador padrão do KDE Firefox). Isso abre o Firefox normalmente, agora queremos abrir outro perfil; para isso, criamos outro iniciador no editor de menus do KDE:

firefox -ProfileManager -no-remote %u

Isso abre o gerenciador de perfis, escolhemos qual perfil usar.

Testada em vários perfis em execução simultaneamente, quando clicamos em um URL de qualquer aplicativo (como um cliente de bate-papo), uma nova guia é aberta no perfil que escolhemos.

Espero que alguém ache isso útil :).

Não testado no Gnome, mas espero que possa ser replicado.


11
Isso não responde à pergunta, o OP quer iniciar o firefox com perfis diferentes a partir de um script automaticamente.
Terdon #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.