wzooff 07.05.2014 11:04

Есть проблема!Выполнение скприпта под отдельным пользователем через ssh

Возникла тут необходимость сканировать с Raspberry Pi. Но вот как то нет под нее сетевого драйвера для эпсона, да и складывать файлы на карту памяти как то не очень хотелось, тк Пи используется в качестве тонкого клиента для подключения по RDP и ограничена по самое нехочу.
Написал скрипт, который можно запустить по ссш
ssh -X user@host 'script'

оно выполняется там и рисует диалоги у нас с помощью zenity.

Так вот скрипт я написал, а вот завести пользователя, под которым можно бы подключаться по ссш без пароля (ключами ссш решаемо) и под ним выполнять ничего кроме скрипта (главный вопрос) - не могу :( Ну или могу, но не знаю как.

Система xubuntu, пробовал завести обычного пользователя, так он почему то может
cat /home/otheruser/file.txt

Что не есть хорошо
Ну и сам скрипт
  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/bin/bash
#init
tmpdir="/tmp/scan"`date "+%d%m%Y%H%M%S"`
#папка куда складывать сканы
outdir="/home/scans/"
#подсеть где работает скансервер
net="10.10.10."

#---------------------------------------------------------------#
# scan profiles #
#---------------------------------------------------------------#
# Name | res | color | pdf #
#---------------------------------------------------------------#
#1 Document | 150 | Gray | no #
#2 Document C | 150 | Color | no #
#3 Document PDF | 150 | Gray | yes #
#4 Document C PDF | 150 | Color | yes #
#5 Passport | 150 | Color | yes # -у нужен для сканирования половинки листа
#6 Photo | 300 | Color | no #


pdfArray[3]=1
pdfArray[4]=1
pdfArray[5]=1
resArray=( "" 150 150 150 150 "150 -y 150" 300 )
colArray=( "" Gray Color Gray Color Color Color )

#выбираем сканер, можно сразу прописывать последний октет айпишника
chscan ()
{
zenity --width=300 --height=300 --list \
--title="Список сканеров" \
--text="Выберите сканер из списка (переключить точечку), если необходимо" \
--hide-header \
--radiolist \
--ok-label="Продолжить" \
--hide-column=2 \
--column="" --column="ip" --column="Сканер" \
true 11 "Директор" \
false 12 "Бухгалтер" \
false 13 "Холл"
}

#выбираем профиль сканирования
chq ()
{
zenity --width=300 --height=300 --list \
--title="Профиль сканирования" \
--hide-header \
--ok-label="Сканировать" \
--text="Выберите подходящий профиль для сканирования.\n\Есть возможность сканировать несколько страниц (оно спросит).\n\При сканировании в PDF все страницы в итоге будут добавлены в один файл.\n\Через некоторое время документы появятся на сервере в папке Scans.\n\Будьте терпеливы :)" \
--radiolist --hide-column=2 \
--column="" --column="q" --column="Профиль" \
true 1 "Чернобелый документ" \
false 2 "Цветной документ" \
false 3 "PDF Многостраничный" \
false 4 "PDF Цветной многостраничный" \
false 5 "PDF Паспорт" \
false 6 "Фото цвет"
}

#сама процедура сканирования
scanme ()
{
#проверяем наличие временной папки
if [ -d $tmpdir ]; then #папка есть сканируем
scanimage -d $device --x-resolution=${resArray[$q]} --y-resolution=${resArray[$q]} --mode=${colArray[$q]} --format=tiff | \
convert tiff:- -quality 50 -quiet $tmpdir"/"`date "+%d-%m-%Y_%H%M%S"`.jpg | \
zenity --progress --pulsate --no-cancel --auto-close --title="Состояние" --text="Идет сканирование..."
#запрос на сканирование еще одной странички
if zenity --question --title="Вопрос" --text="Отсканировать еще одну страницу?"; then
scanme
else
#пдф
pdf=${pdfArray[$q]}
if [ -z "$pdf" ]; then #если нет - просто перемещаем файлы в итоговую папку
mv $tmpdir/* $outdir && rm -rf $tmpdir
else # конвертим и перемещаем в итоговую папку
convert $tmpdir/*.jpg $outdir`date "+%d-%m-%Y_%H%M%S"`.pdf && rm -rf $tmpdir
fi

fi
else #если нет папки, то создадим ее
mkdir $tmpdir
scanme
fi
}


#проверяем были ли выбран сканер
while [ -z "$ip" ]; do
ip=$(chscan)
if [ -z "$ip" ]; then
if zenity --width=300 --question --title="Вопрос" --text="Вы не выбрали сканер!\n\n\Отменить сканирование?"; then
exit 0
fi
fi
done

#проверяем были ли выбран профиль сканирования
while [ -z "$q" ]; do
q=$(chq)
if [ -z "$q" ]; then
if zenity --width=300 --question --title="Вопрос" --text="Вы не выбрали профиль сканирования.\n\n\Отменить сканирование?"; then
exit 0
fi
fi
done

#генерируем имя девайса - драйвер+подсеть+ip
device="epkowa:net:"$net$ip
#вызываем процедуру сканирования
scanme

exit 0




Тэги: bash scanning ssh Сканирование сканирование по сети
+ 0 -
Похожие Поделиться

dront78 07.05.2014 11:51 #
попробуйте в ~/.ssh/authorized_keys перед ключем добавить замечательные команды

command="ваш скрипт"
и куча опций на выбор
no-port-forwarding
no-X11-forwarding
no-agent-forwarding
no-pty
и так далее man ssh

при подключении по ssh будет запускаться только скрипт
dront78 07.05.2014 11:53 #
выглядеть будет прмерно так
command="script.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa ...
wzooff 07.05.2014 17:42 #
Действительно замечательные команды )
dront78 08.05.2014 09:53 #
если script на user input что-то принимает, повнимательнее гляньте, чтобы дыр не было
wzooff 10.05.2014 02:06 #
Ну скрипт предлагает варианты, юзеру только из готового выбирать и ок тыцкать. Уже в работе :)