Форум сайта python.su
0
Всем привет!
Продолжаю баловаться с пайтоном и столкнулся с задачей запуска пайтона (который в свою очередь запускает шелл).
Есть кусок html страницы, где 3 поля ввода и одна кнопка.
<form method=POST action="/cgi-bin/copy_schema.py"> <P><B>Enter schema, you want to copy from:</B> <P><input type=text name=user_old> <P><B>Enter new schema name:</B> <P><input type=text name=user_new> <P><B>For creation confurmation, please enter your email address:</B> <P><input type=text name=email> <P><input type=submit> </form>
#!/usr/bin/env python import cgi import os user_old = cgi.FieldStorage() user_new = cgi.FieldStorage() email = cgi.FieldSotrage() doc_yes = """ <html> <head> <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> <title>The job is done!</title> </head> <body> Copy command sended succesfully. Please wait for email confirmation from server, when schema is ready. </body> </html> """ doc_no = """ <html> <head> <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> <title>Error!</title> </head> <body> Command has not been sent to database. Did you fill all forms? </body> </html> """ doc_no_email = """ <html> <head> <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> <title>Error!</title> </head> <body> You didn't fill the "email" form. Command has been sended successfully, but you won't receive email about creation comfurmation. </body> </html> """ if 'email' in email: if 'user' in user_old: if 'user' in user_new: user_new = cgi.escape(user_new['user'].value) user_old = cgi.escape(user_old['user'].value) email = cgi.escape(email['email'].value) os.system('copy_schema.sh {0} {1} {2} > dev/null 2>$1'.format(user_old, user_name, email)) print(doc_yes) else: print(doc_no) else: print(doc_no) else: print(doc_no)
#!/bin/bash -l sqlplus -S SYSTEM/MANAGER <<<"drop user $2 cascade;" sqlplus -S SYSTEM/MANAGER <<<"create user $2 identified by $2;" sqlplus -S SYSTEM/MANAGER <<<"grant connect to $2;" sqlplus -S SYSTEM/MANAGER <<<"create database link tmp_$$ connect to system identified by manager using 'localhost:1521/orcl';" impdp system/manager nologfile=Y remap_schema=$1:$2 network_link=TMP_$$ schemas=$1 EXCLUDE=STATISTICS sqlplus -S SYSTEM/MANAGER <<<"drop database link tmp_$$;" [[ -n "$3" ]] && /usr/sbin/sendmail $3 <<<"Your export import task from $1 to $2 has been completed!"
user_old = cgi.FieldStorage() user_new = cgi.FieldStorage() email = cgi.FieldSotrage()
user_new = cgi.escape(user_new['user'].value) user_old = cgi.escape(user_old['user'].value) email = cgi.escape(email['email'].value) os.system('copy_schema.sh {0} {1} {2} > dev/null 2>$1'.format(user_old, user_name, email))
Офлайн
857
thomas
и по этому кусочку:
thomasos.system('copy_schema.sh {0} {1} {2} > dev/null 2>$1'.format(user_old, user_name, email))
import os text = 'Hello.' os.system('echo {} 1>/dev/null'.format(text)) text = '| cat /etc/passwd 1>&2 | echo' os.system('echo {} 1>/dev/null'.format(text))
Отредактировано py.user.next (Сен. 15, 2014 23:26:12)
Офлайн
0
Спасибо за комментарий! А в остальном с синтаскической точки зрения все ОК? потому что при запуске из браузера ничего не происходит, ожидается веб сервер, а на вебсервере просто идет пайтоновский процесс.
Офлайн
857
thomasПеред выполнением команды выведи принятые поля, а команду закомментируй пока. Убедись, что всё точно выводит.
потому что при запуске из браузера ничего не происходит, ожидается веб сервер, а на вебсервере просто идет пайтоновский процесс.
thomasТрёхэтажную конструкцию лучше переделать в одну одноэтажную, так как ветвь else у них одинаковая. Если же эти ветви разные, то также лучше переделать её в три одноэтажных.
А в остальном с синтаскической точки зрения все ОК?
Отредактировано py.user.next (Сен. 23, 2014 10:22:43)
Офлайн
0
Я сменил команду на обычный print вводимых переменных, но скрипт по-прежнему висит в ожидании.
То ли лыжи, то ли я чего-то не понимаю.
Офлайн
0
Что наблюдательно - при отключении от страницы в лог вылезло следующее:
File "/opt/oracle/dbscripts/web_dba_lite/cgi-bin/copy_schema.py1", line 9, in <module> email = cgi.FieldSotrage() AttributeError: 'module' object has no attribute 'FieldSotrage' ktovmasian-ibm.oilspace.net - - [25/Sep/2014 13:07:58] CGI script exit status 0x100
Офлайн
0
По этому фрагменту заметил опечатку: Sotrage -> Storage.
но проблему это не решило, браузер по-прежнему висит, но при закрытии страницы в лог ничего не идет.
Офлайн
857
thomas
Я сменил команду на обычный print вводимых переменных
Прикреплённый файлы:
cgiform.tar (10,0 KБ)
Офлайн
0
py.user.next
Теперь приблизительно стало ясно как работает cgi.FieldStorage()
Я изменил
if 'email' in form:
if 'user_old' in form:
if 'user_new' in form:
print('<p>email:', form['email'].value)
print('<p>user_old:', form['user_old'].value)
print('<p>user)new:',form['user_new'].value)
#user_new = cgi.escape(user_new['user'].value)
#user_old = cgi.escape(user_old['user'].value)
#email = cgi.escape(email['email'].value)
#os.system('copy_schema.sh {0} {1} {2} > dev/null 2>$1'.format(user_old, user_name, email))
#print(doc_yes)
else:
print(doc_no)
else:
print(doc_no)
else:
print(doc_no_email)
Офлайн
857
thomasВыведи перед if'ами.
Однако, если все поля заполнены, переменные не выводятся.
Офлайн