Как удаленно открыть URL в Firefox в определенном профиле?


9

У меня есть несколько экземпляров Firefox с несколькими разными профилями. Среди них профили с названиями «программное обеспечение» и «тест».

Я пытаюсь открыть URL из скрипта bash, чтобы он открывался в профиле «test», например:

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

Однако это открывает его в профиле «программное обеспечение» в любом случае. Любые идеи?

Mozilla / 5.0 (X11; U; Linux x86_64; en-US; rv: 1.9.1.8) Gecko / 20100308 Iceweasel / 3.5.8 (например, Firefox / 3.5.8)

Нет, это не проблема с разрешениями, все каталоги моего профиля находятся в полном разрешении:

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# 

Ответы:


7

Извините за опоздание на 3 года, я заинтересовался этой темой только сейчас и нашел этот вопрос.

Я нигде не нашел документированного решения, поэтому я проверил исходный код, и вот очень важная часть: http://dxr.mozilla.org/mozilla-central/source/toolkit/xre/nsAppRunner.cpp#1537

Здесь nullptr в конце строки, к сожалению, означает, что аргумент профиля не передается в функцию SendCommandLine, поэтому невозможно выбрать правильное окно firefox для отправки сообщения openurl.

Однако мы видим, что имя пользователя передается и имя пользователя инициализируется из переменной среды LOGNAME. Исходя из этого, я пришел к следующему решению:

  • Я обертываю Firefox этим скриптом, который называется firefox.sh:
FOX_PROFILE = facebook
export LOGNAME = errge. $ FOX_PROFILE
/ opt / firefox / firefox -profile ~ / .mozilla_profiles / $ FOX_PROFILES "$ @"
  • при первом запуске запускается новый экземпляр, и каталог ~ / .mozilla_profiles / facebook должен существовать,

  • когда запускается второй раз, если профиль facebook уже запущен, он правильно подключается к нему,

  • он может правильно отправлять команды нескольким различным рабочим профилям (конечно, вы должны изменить параметр FOX_PROFILE в первой строке в разных сценариях).

Я проверил это с Firefox 26 на Linux, и это работает.

В качестве альтернативы, вот мое полноценное решение, которое вы можете или не хотите использовать:

#! / Bin / Баш

установить -е

FOX = / Opt / светлячок / светлячок

MESSAGE = $ @

if [-z "$ FOX_PROFILE"]; тогда
  if [-z "$ {MESSAGE}"]; тогда
    FOX_PROFILE = по умолчанию
  еще
    FOX_PROFILE = $ (kdialog - по умолчанию по умолчанию --menu "- $ {MESSAGE} -" по умолчанию по умолчанию google google facebook facebook errge errge spam spam)
  фи
фи
экспортировать FOX_PROFILE

# Этот взлом нужен, потому что Firefox удаленная отправка командной строки
# игнорирует параметр профиля. См. NsAppRunner.cpp: 1505.
export LOGNAME = errge. $ FOX_PROFILE

# Использование фонового выполнения вместо exec, поэтому поведение
# соответствует, когда профиль уже запущен и когда он просто
# запуск.
$ FOX -профиль ~ / .mozilla_profiles / $ FOX_PROFILE "$ @"

# Огромный успех.
выход 0

Если вы запускаете скрипт без каких-либо параметров, он автоматически выбирает профиль по умолчанию, но вы можете переопределить его, установив FOX_PROFILE вручную в вашей оболочке. Если URL-адрес передается в командной строке, он всегда запрашивает профиль, в котором его можно открыть, это потому, что я в основном кликаю в своей программе чата и электронной почты, и в этом случае я хочу всегда выбирать профиль (Google для календаря спам, фейсбук на день рождения, спам и т.д.). Конечно, вы можете изменить логику в соответствии со своим стилем использования, это всего лишь пример, важным знанием является трюк с LOGNAME.

И, конечно же, вы должны убедиться, что этот скрипт-обертка - единственный способ запустить браузер на вашем компьютере. Потому что, если вы откроете профиль без правильного имени LOGNAME, вы больше не сможете общаться с этим профилем. Я поставил этот скрипт первым на моем пути через несколько имен с символическими ссылками, таких как x-www-browser, firefox, sensible-browser, и поместил его также в переменную окружения BROWSER. Как это сделать, зависит от вашего дистрибутива GNU / Linux.


Большое спасибо за это. Мне кажется, что настройка профиля не обязательна, а настройки LOGNAME достаточно для правильной работы.
dset0x

0

Если у вас уже запущен экземпляр, Firefox будет использовать его повторно. Попробуй firefox -no-remote.


Но я хочу, чтобы он повторно использовал экземпляр! Только конкретный, а не случайный, который ему нравится. Если я попытался добавить «-no-remote» к своей команде, я получаю: «Iceweasel уже запущен, но не отвечает. Чтобы открыть новое окно, вы должны сначала закрыть существующий процесс Iceweasel или перезапустить вашу систему».
Мирник

Ах, это делает это более интересным. Боюсь, я не знаю, как ты мог это сделать. IIUC, -no-remote отключает «разговор» между экземплярами. Это может быть далеко от цели и полного перерасхода, но вы можете создать расширение, которое опрашивает центральную очередь URL-адреса файла или сервера и открывает его, когда оно предназначено для текущего профиля. Затем вы устанавливаете это расширение во всех ваших экземплярах.
Янмезен

0

@miemik

«Но я хочу, чтобы он повторно использовал экземпляр! Только определенный, а не случайный, который ему нравится. Если я попытался добавить« -no-remote »к моей команде, я получаю:« Iceweasel уже запущен, но не отвечает. Чтобы открыть новое окно, вы должны сначала закрыть существующий процесс Iceweasel или перезапустить систему. "

У вас есть проблема с разрешением вашего профиля dir ... проверьте разрешение. Вы скопировали или переместили его из другого места (раздел .. диск ..)?

Решение:

Станьте пользователем root и запустите top, чтобы увидеть, работает ли он как root. Затем ls -ld в профиле dir (который должен находиться под вашим домашним каталогом с точкой (.) Перед ними ... означает, что вы должны использовать "ls -al", чтобы увидеть его).

Проверьте другое разрешение этого dir и измените соответственно.

Ура!


Я проверил разрешения и вставил результат в редактирование моего вопроса. Это не та проблема.
Мирник

0

Это не сработает. Единственный способ запустить 2 экземпляра приложения Mozilla - отключить удаленные подключения ко второму (обычно с MOZ_NO_REMOTE = 1). Это означает, что вы отключаете возможность взаимодействия с другими экземплярами (например, создание, открывающее новую страницу).

Таким образом, вы можете либо открыть новое приложение с no remoteвключенным, либо повторно использовать экземпляр, который разрешает удаленный доступ.


Это действительно работает, см. Ответ Errge. Что вы подразумеваете под этим не будет работать ?
Очков

0

Вы должны иметь возможность добавить -no-remoteвызов только к тестовому профилю (после того, как профиль программного обеспечения уже открыт) следующим образом:

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

Это должно позволить всем другим ссылкам по-прежнему открываться в другом профиле удаленно.

Если это решение не работает, вы всегда можете запустить Firefox как отдельный пользователь для тестирования, используя sudo -u. Firefox действительно должен быть в состоянии справиться с этим правильно с помощью профилей, хотя.


Этот ответ не может быть хорошим, потому что с -no-remoteфлагом запускается новый экземпляр Firefox, и вопрос требует повторного использования существующих экземпляров Firefox, если они уже запущены.
Очков

0

Если у вас уже открыт Mozilla Firefox с профилем по умолчанию или любым другим, попробуйте:

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

Протестировал и работал для меня с Mozilla Firefox с 2.x до 12.x


Этот ответ не может быть хорошим, потому что командная строка не содержит требуемый профиль для использования.
Очков

0

При первом запуске экземпляра Firefox с данным профилем используйте команду:

firefox -P foo -new-instance

Вы можете добавить URL в конце команды выше, чтобы открыть его. Позже, когда вы захотите открыть URL в этом экземпляре, вы можете использовать:

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

Если вы пишете сценарий и хотите узнать, есть ли уже экземпляр, выполняющий этот профиль, чтобы увидеть, какие из перечисленных выше команд должны быть вызваны, вы можете использовать:

firefox -P foo -remote 'ping()'

Протестировано с Firefox 34 на Linux.

Обратите внимание, что в настоящее время в Firefox есть ошибка, которая выдает ошибку вместе с сообщением

Error: Failed to send command: 500 command not parseable

если -remote openurl()команда сделана без управляющего tty (например, из скрипта, запущенного демоном).

Я столкнулся с этой ошибкой при запуске скрипта из файла .desktop в KDE (например, из панели запуска на панели), поэтому мне пришлось отметить опцию «запустить в терминале», что немного раздражает.


-1

Для справки, одно из решений: в KDE мы настроили браузер по умолчанию для запуска следующей командой:

firefox -P "default"

где «default» - наш профиль, который мы хотим использовать каждый раз.

Теперь мы запускаем наш экземпляр Firefox без аргументов (средство запуска KDE Firefox по умолчанию). Это открывает Firefox нормально, теперь мы хотим открыть другой профиль, для этого мы создаем еще один лаунчер в редакторе меню KDE:

firefox -ProfileManager -no-remote %u

Это открывает менеджер профилей, мы выбираем, какой профиль использовать.

Протестировано на нескольких одновременно работающих профилях, когда мы нажимаем на ссылку в любом приложении (например, в чате), и в выбранном нами профиле открывается новая вкладка.

Надеюсь, кто-то найдет это полезным :).

Не тестировался на Gnome, но я надеюсь, что он может быть воспроизведен.


1
Это не отвечает на вопрос, ОП хочет автоматически запускать Firefox с различными профилями из скрипта.
Тердон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.