Запуск Skype от стороннего пользователя

У того кто попал на эту страницу случайно может возникнуть вопрос:
Зачем запускать Skype от стороннего (другого) пользователя?
Это вопрос безопасности.

  • Чтобы скайп не совал свой нос в ваши файлы
  • Чтобы тот кто сможет взломать скайп не совал нос в ваши файлы

Для работы Skype нужен только доступ в интернет и к папке с его профилем. Всё остальное, в частности доступ к вашим папкам и файлам, ему не нужен. Поэтому отрежем всё остальное поместив работающий Skype в пространство стороннего (другого) непривелигированного пользователя.

Этот пользователь будет предназначен только для запуска скайп. Поэтому нужно создать этого пользователя. Но прежде нужно создать группу  skype  и пользователя  skype  от чьего имени будем запускать Skype.

# groupadd skype

Затем в эту группу создать пользователя  skype  с домашним каталогом  /home/skype/  и шелом  /bin/bash 

# useradd -m -g skype -G audio,video -s /bin/bash skype

И не забывайте поставить пароль

# passwd skype
Примечание: Возможно вам потребуется добавить пользователя  skype  в группы «pulse-access» и «pulse-rt». Однако у меня на Fedora 16 прекрасно работает указанная в команде группы  audio  и  video .

После этих действий уже можно запустить шел и сменить пользователя и там запустить скайп

[user001@m750 ~]$ su -l skype
Password: 
[skype@m750 ~]$ skype
[skype@m750 ~]$

После этого вы увидите окно скайпа загружающего профиль «по-умолчанию».
Но этого не достаточно для запуска skype в автоматическом режиме прямо из скрипта.

Далее мы добавим в файл  /home/skype/.bashrc :

export DISPLAY=":0.0"

А теперь скайп можно запустить простой командой:

[user001@m750 ~]$ xhost +local: && su skype -c skype
non-network local connections being added to access control list
Password: 
Примечание: Без команды  xhost , Skype у меня вываливался с ошибкой “No protocol specified” в stdout.

Далее чтобы упростить запуск Skype я прописываю алиас в пользовательском  /home/user001/.bashrc  от которого работаю

alias xhost +local: && su skype -c "/home/skype/skype.sh"

Ну и осталось открыть содержимое командного файла из профиля пользователя «skype»

#!/bin/bash

  TEST=""
  TEST=`ps afx | grep skype | grep user-one | awk '{print $1}'`
  if [ -z "${TEST}" ] ; then
    echo "trying to start skype user-one"
    nohup skype --dbpath=/home/skype/.Skype-user-one &>> /home/skype/nohup-user-one.log 2>&1&
  else
    echo -e "user-one is running on pid [${TEST}]"
  fi

Данный командный файл проверяет что скайп не запущен и затем запускает его с игнорированием сигналов потери связи (hangup) и скайп будет продолжать выполняться в фоновом режиме и после того, как пользователь skype выйдет из системы.
В домашнем каталоге пользователя skype будет создан файл  /home/skype/nohup-user-one.log . Именно туда будут записываться все ошибки которые скайп будет выводить во время работы.
Обратите внимание что скайп запускается с профилем  /home/skype/.Skype-user-one  отличным от дефолтного. Таким образом можно запустить несколько Skype с разными профилями и решить вопрос «два и более скайпов одновременно».

Невозможно сохранить файл

В Skype 2.0.0.35 (как в последующих вплоть до 4.3.0.37) для Linux есть одна особенность переноса профиля. Если перенести профиль скайпа в другого пользователя то окажется, что Skype не может сохранять файлы которые принимает. Это связано с тем, что он хранит в профиле абсолютный путь к папке с файлами которые сохраняет. В этой версии скайп настройка каталога для сохранения файлов есть только в окне сохранения файлов. Установите её в каталог пользователя скайп.

Для проверки правильности установки пути в профиле можно использовать такой скрипт. В качестве параметра ему необходимо передать путь к профилю skype.

  PROFILE=$1
  # выловить из профиля аккаунт по-умолчанию
  ACCOUNT=`cat ${PROFILE}/shared.xml | sed -n '/<Account>/,/<\/Account>/p' | sed -e 's/[ \t]\+//g' | grep '<Default>' | sed -e 's/^<Default>\(.*\)<\/Default>$/\1/g'`
  echo -e "-----------------\nProfile \"${PROFILE}/${ACCOUNT}\""
  if [ -n "${ACCOUNT}" ] && [ -e "${PROFILE}/${ACCOUNT}/config.xml" ] ; then
    DOWNLOADPATH=`cat "${PROFILE}/${ACCOUNT}/config.xml" | sed -n '/^[ \t]*<FileTransfer>[ \t]*$/,/^[ \t]*<\/FileTransfer>[ \t]*$/p' | grep '<SavePath>' | sed -e 's/[ \t]*<SavePath>\(.*\)<\/SavePath>[ \t]*$/\1/g'`
    if [ -n "${DOWNLOADPATH}" ] && [ -e "${DOWNLOADPATH}" ] ; then
        echo -e "Download path is [OK]"
    else
        [ -z "${DOWNLOADPATH}" ] && echo -e "Download path not defined." || echo -e "Download path \"${DOWNLOADPATH}\" not exists."
        exit 1
    fi
  else
    echo -e 'Default account not found. Download folder not checked.'
    exit 1
  fi

Чтобы файлы принимаемые скайп были доступны вашему пользователю не забудьте поставить правильно права и примонтировать её или прилинковать прямо в дерево вашего пользователя. У меня это user001.

Я это делаю через smb поднятый на той же машине.
Например в этом варианте при линковке пароль будет запрошен интерактивно:

$ sudo mount -t cifs -o rw,nosetuids,gid=1000,uid=1000,nounix,iocharset=utf8,user=skype "//127.0.0.1/skype/SkypeDownload" "/home/user001/mounts/skype-download"

gid=1000 и uid=1000 это идентификаторы пользователя user001 и группы user001.
А вот так можно автоматизировать ввод пароля:

$ sudo mount -t cifs -o rw,nosetuids,gid=1000,uid=1000,nounix,iocharset=utf8,credentials="/home/user001/skypecredentials.smb" "//127.0.0.1/skype/SkypeDownload" "/home/user001/mounts/skype-download"

Содержимое файла skypecredentials.smb это пара строк:

$ cat /home/user001/skypecredentials.smb
username=skype
password=slkdjfoWie376jfrowief

Раз уж mount выполняется с привилегиями root то для пущей безопасности файл /home/user001/skypecredentials.smb можно разместить в профиле пользователя /root/. Это спрячет файл с логином и паролем к пользователю скайпа чтобы он не валялся где-то в профиле user001.

Внимание!Так как скайп запускается от другого пользователя, попытка открыть гиперссылку из окна чата скайпа будет запускать копию браузера в окружении пользователя от которого запущен скайп. По этой же причине не получится перетащить файл методом Drag-n-Drop в окно скайпа. В окно вставится текстовая ссылка на файл. Поэтому обмен файлами необходимо выполнять через папку к которой имеет доступ пользователь от чьего имени запущен скайп.

Открываем новый или переоткрываем старый терминал, чтобы отработал изменённый bashrc и проверяем

[user001@m750 ~]$ skype
non-network local connections being added to access control list
Password: 
trying to start skype user-one

Готово.

Обновлено 14.01.2015.