Прошу помощи у сообщества. Кто знает как разрешить данную проблему, помогите.Есть авторизаци c помощью LDAPа. Есть пользователь в LDAP.
И это пользователь не может копирывать фалы с помощь scp на ту машину где есть его учетка ( не может в Linux хотя в Windows с помощью WinSCP все копируеться ).Для авторизации пользователей есть скрипт ( Python ) который выступает в роли оболочки для пользователя. Собственно что он делает.
1) Проверяет есть ли доступ к машине у пользователя ( pam_check_host модуль не подошел. Причина почему ? Не коректно отрабатывает иногда. А коректно должно быть постоянно когда у тебя 300 машин.)
2) Устанавлеваетья TMOUT переменная для пользователя при подключении ( В LDAP добавлен параметр TMOUT )
3) Получает оболочку /bin/bash.Всего три функции выполняет скрипт.
По ssh вход без проблем. Но вот scp не копирует файлы.
Делал эксперементы, копирование проводилось на тот хост где есть учетка в LDAP.
Для наглядности как копировал:
cat /iotop-0.4.4-1.noarch.rpm | ssh USER@HOSTNAME "cat >/tmp/file"
Что бы увидеть что происходит, потому как scp просто ждет.И получаю слудующую ошибку:
/bin/bash: строка 1: #��/sn�d44ac02136b83884a0630a6e0c40b36cced53bb6#}
/bin/bash: строка 2: ошибка синтаксиса около неожиданной лексемы `('
/bin/bash: строка 2: `##$!#И копирование проводилось на хост где нет учетки в LDAPe.
Все скопировалось.Что вижу из этого, мой /bin/bash.py не принемает каких-то параметров от scp что бы их передать /bin/bash, и вываливаеться ( ждет ). Понимаю что /bin/bash это ПОДОБОЛОЧКА для /bin/bash.py и scp просто не знает что ему делать. Вообщем
если написать вот такой скриптец:cat >> /bin/bash.sh <<EOF
#!/bin/bash
/bin/bash
EOF
chmod 755 /bin/bash.shИ это /bin/bash.sh прописать в passwd для пользователя как оболочку.
Так же ни чего копироваться не будет.И что с этим делать ?
>[оверквотинг удален]
> что ему делать. Вообщем
> если написать вот такой скриптец:
> cat >> /bin/bash.sh <<EOF
> #!/bin/bash
> /bin/bash
> EOF
> chmod 755 /bin/bash.sh
> И это /bin/bash.sh прописать в passwd для пользователя как оболочку.
> Так же ни чего копироваться не будет.
> И что с этим делать ?1. я бы запустил сервер в отладочном режиме
/usr/lib/sshd -d -d -e -D -p 2222
например
2. установил бы трассировку в login shellcat > /bin/bash.sh <<EOF
!/bin/bash
exec /bin/bash -o xtrace
EOF
>[оверквотинг удален]
> должно быть постоянно когда у тебя 300 машин.)
> 2) Устанавлеваетья TMOUT переменная для пользователя при подключении ( В LDAP добавлен
> параметр TMOUT )
> 3) Получает оболочку /bin/bash.
> Всего три функции выполняет скрипт.
> По ssh вход без проблем. Но вот scp не копирует файлы.
> Делал эксперементы, копирование проводилось на тот хост где есть учетка в LDAP.
> Для наглядности как копировал:
> cat /iotop-0.4.4-1.noarch.rpm | ssh USER@HOSTNAME "cat >/tmp/file"
> Что бы увидеть что происходит, потому как scp просто ждет.ИМХО оригинально. посылать на вход ssh содержимое rpm.... он конечно читать будет, но вот как интерпритирует...
>[оверквотинг удален]
> что ему делать. Вообщем
> если написать вот такой скриптец:
> cat >> /bin/bash.sh <<EOF
> #!/bin/bash
> /bin/bash
> EOF
> chmod 755 /bin/bash.sh
> И это /bin/bash.sh прописать в passwd для пользователя как оболочку.
> Так же ни чего копироваться не будет.
> И что с этим делать ?
>[оверквотинг удален]
>> что ему делать. Вообщем
>> если написать вот такой скриптец:
>> cat >> /bin/bash.sh <<EOF
>> #!/bin/bash
>> /bin/bash
>> EOF
>> chmod 755 /bin/bash.sh
>> И это /bin/bash.sh прописать в passwd для пользователя как оболочку.
>> Так же ни чего копироваться не будет.
>> И что с этим делать ?"За что купил за то продал". Знаешь есть такая пословица ? Это я к тому что послал в ssh то и получил ...
> "За что купил за то продал". Знаешь есть такая пословица ? Это
> я к тому что послал в ssh то и получил ...а я к тому, что зачем rpm-ы-то по ssh ;)? если только в качестве примера... или мания преследования заела? )
>> cat /iotop-0.4.4-1.noarch.rpm | ssh USER@HOSTNAME "cat >/tmp/file"
> ИМХО оригинально. посылать на вход ssh содержимое rpm.... он конечно читать будет, но вот как интерпритирует...откроет на удаленном хосте указаную команду и передаст ей стандартный ввод. Обычно это так происходит. Есть даже такой паттерн для копирования между хостами --
( cd /path/ && tar cf - dirtocopy ) | ssh user@host "cd /path && tar xfvp -"
>>> cat /iotop-0.4.4-1.noarch.rpm | ssh USER@HOSTNAME "cat >/tmp/file"
>> ИМХО оригинально. посылать на вход ssh содержимое rpm.... он конечно читать будет, но вот как интерпритирует...
> откроет на удаленном хосте указаную команду и передаст ей стандартный ввод. Обычно
> это так происходит. Есть даже такой паттерн для копирования между хостами
> --
> ( cd /path/ && tar cf - dirtocopy ) | ssh
> user@host "cd /path && tar xfvp -"спасибо, Кэп. только командой в данном случае является "рукодельный" шелл и ОН стандартный ввод обработать должен. как я уже сказал - он его прочитает, но вот что с ним сделает - это другой вопрос. как-то так...
> И что с этим делать ?
ну, во-первых, у ssh (и scp) есть целых три ключа -v, можно посмотреть, чего он ждет. Во вторых, то, что у пользователя в качестве оболочки в /etc/passwd должно быть прописано в /etc/shells. Кроме того, что значит "для авторизации есть скрипт"? Где точка запуска скрипта? Он подключен, как модуль pam или стоит, как оболочка в passwd? Что сказано в логах по поводу этих коннектов? Кроме того, в мане к ssh должно быть написано в какой последовательности запускается шелл для пользователя, rtfm.
> 1 ) ну, во-первых, у ssh (и scp) есть целых три ключа -v. можно
> посмотреть, чего он ждетНу мне вообщем известно что есть, но вот не известно чего он ждет.
> 2) Во вторых, то, что у пользователя в
> качестве оболочки в /etc/passwd должно быть прописано в /etc/shells.Прописано.
> 3) Кроме того,
> что значит "для авторизации есть скрипт"?А то и значит что для авторизации.
> 4) Где точка запуска скрипта?
Не совсем понял.
> 5) Он
> подключен, как модуль pam или стоит, как оболочка в passwd?Стоит как оболочка в passwd.
> 6) Что
> сказано в логах по поводу этих коннектов?Ни че го ... просто ждет чего-то.
>[оверквотинг удален]
> cat >> /bin/bash.sh <<EOF
> #!/bin/bash
> /bin/bash
> EOF
> chmod 755 /bin/bash.sh
> И это /bin/bash.sh прописать в passwd для пользователя как оболочку.
> Так же ни чего копироваться не будет.
> И что с этим делать ?ЕЩЕ РАЗ!!! КАК ИНТЕРПРИТИРУЕТ рукодельный шелл передаваемые ему данные?!!! ответ: в данном случае никак. просто запускается копия bash, которая ждет ввода команды.
а как на счет такого "bash.sh" например?
#!/bin/bash
shift
eval $*различия видно?
PS
не проще ли sftp использовать для копирования файлов?
#!/bin/bash
if [ $# -eq 0 ]
then
# шелл
/bin/bash
else
# команда
shift
eval $*
fiитд по мере фантазии и надобности.
>[оверквотинг удален]
> if [ $# -eq 0 ]
> then
> # шелл
> /bin/bash
> else
> # команда
> shift
> eval $*
> fi
> итд по мере фантазии и надобности.Если бы вот это еще и чере python работало было бы замечательно. У меня при подключении вызываеться python скрипт, а только потом выдаеться bash.
>[оверквотинг удален]
>> /bin/bash
>> else
>> # команда
>> shift
>> eval $*
>> fi
>> итд по мере фантазии и надобности.
> Если бы вот это еще и чере python работало было бы
> замечательно. У меня при подключении вызываеться python скрипт, а только потом
> выдаеться bash.если наводок не понимаешь то:
с одного языка на другой перевести не можешь?
или думаешь, что тут телепаты есть, чтоб парсить твой неизвестный код на питоне?выкладывай_исходник/ думай_сам / http://natribu.org/
>[оверквотинг удален]
>>> fi
>>> итд по мере фантазии и надобности.
>> Если бы вот это еще и чере python работало было бы
>> замечательно. У меня при подключении вызываеться python скрипт, а только потом
>> выдаеться bash.
> если наводок не понимаешь то:
> с одного языка на другой перевести не можешь?
> или думаешь, что тут телепаты есть, чтоб парсить твой неизвестный код на
> питоне?
> выкладывай_исходник/ думай_сам / http://natribu.org/#!/usr/bin/env python
import os
import ldap
import pwd
import socket
import sysdef basH( tmout ):
os.system('\n \
if [ -f $HOME/.bashrc ]; \n \
then \n \
echo -en "" \n \
cat $HOME/.bashrc | \
sed -e \'1,1d\' > /tmp/rcfile-tmp.$$ \n \
cat /tmp/rcfile-tmp.$$ | \
sed -e \'export TMOUT=' + str( tmout ) + ' ; readonly TMOUT\' > /tmp/rcfile-bash.$$ ; \
mv /tmp/rcfile-bash.$$ $HOME/.bashrc \n \
rm -f /tmp/rcfile-tmp.$$ \n \
/bin/bash \n \
fi \
else \n \
echo "export TMOUT=' + str( tmout ) + ' ; readonly TMOUT" > $HOME/.bashrc \n \
echo "" >> $HOME/.bashrc \n \
echo "alias rm=\'rm -i\'" >> $HOME/.bashrc \n \
echo "alias cp=\'cp -i\'" >> $HOME/.bashrc \n \
echo "alias mv=\'mv -i\'" >> $HOME/.bashrc \n \
echo "" >> $HOME/.bashrc \n \
echo "if [ -f /etc/bashrc ]; then" >> $HOME/.bashrc \n \
echo " . /etc/bashrc" >> $HOME/.bashrc \n \
echo " fi" >> $HOME/.bashrc \n \
echo -en "" \n \
/bin/bash \n \
fi \
')try:
serverldap = socket.gethostbyname( ' HOSTNAME ' )
l = ldap.initialize("ldaps://" + serverldap + ":636")
l.simple_bind_s("","")
login = pwd.getpwuid(os.getuid())[0]
base_dn = "ou=People,o=BASENAME"
filter = "(uid=" + login + ")"
findUID = str("uid=") + login + str(",ou=People,o=BASENAME")
userUID = str("uid=") + login
except ldap.SERVER_DOWN:
basH( tmout='950' )
sys.exit()
try:
try:
ldapHostIp = dict = l.search_s( findUID, ldap.SCOPE_BASE, userUID )[0][1]
ldapHostIp = ldapHostIp.get('host')
except TypeError:
pass
except ldap.NO_SUCH_OBJECT:
sys.exit()try:
try:
tmout = dict = l.search_s( findUID, ldap.SCOPE_BASE, userUID )[0][1]
tmout = tmout.get('TMOUT')
except TypeError:
pass
except ldap.NO_SUCH_OBJECT:
sys.exit()if tmout:
for i in tmout:
tmout = i
else:
tmout = 0ipaddr = os.popen('cat /etc/sysconfig/network-scripts/ifcfg-* | grep IPADDR | grep -v 127').read()
ipaddr = ipaddr.split('IPADDR=')ip = []
for i in ipaddr:
ip.append(i[:-1])
ip = ip[1:]A = ldapHostIp
B = ipimport sys
import osfor host in A:
for ipaddr in B:
try:
if socket.gethostbyname( host ) == ipaddr:
basH( tmout )
except socket.gaierror:
pass
if '*' == host:
basH( tmout )
break
if '!ALL' == host:
pass
Для не телепатов :)
Да, и рассказывать мне о всяких там pam ldap не надо. Мол, "А нафига тебе скрипт этот, ты что не знал что есть pam_check_host_attr, или тебе делать нефиг велосипед изобретать ?".
ты выдаешь bash в качестве оболочки. как говорит авторитетный товарисч Lavr - читай выше до просветления.PS
последняя попыдка наводки: bash - это интерпритатор команд, он ничего не копирует и ничего вообще не делает, пока ему команду не передадут. он просто ждет ввода команды.
> ты выдаешь bash в качестве оболочки. как говорит авторитетный товарисч Lavr -
> читай выше до просветления.
> PS
> последняя попыдка наводки: bash - это интерпритатор команд, он ничего не копирует
> и ничего вообще не делает, пока ему команду не передадут. он
> просто ждет ввода команды.Вообще я знаю что такое баш.
Короче ладно, наводку получил буду разбираться.
> Вообще я знаю что такое баш.
> Короче ладно, наводку получил буду разбираться.Странно тогда, что ты не передаешь никакую командную строку ему (для начала) и ожидаешь, что он что-то сделает.
для scp bash вообще ничего не значит. просто проверка, что у пользователя есть доступ к шелу на компе - дополнительня проверка вшивости. если хочешь, чтоб копировало - создавай свою оболочку, которая реальные действия выполняет и ей управление передавай. Выше все уже показал.