LINUX.ORG.RU
ФорумAdmin

Где ошибка в коде?

 


0

1

Где тут ошибка? не хочешь записывать данных из переменной.

echo -n "Введите ваш root пароль и нажмите [ENTER]: "
read pass
echo -n "Введите ваш IP сервера и нажмите [ENTER]: "
read IP

echo "INSERT INTO `game`.`locations` VALUES (3,'Локация #1','$IP','$IP','root','$pass',1);" | mysql -uroot -p$rootmysqlpass

Ответ на: комментарий от MrSullex

Ну, сделай

'INSERT INTO `game`.`locations` VALUES (3,"Локация #1","$IP","$IP","root","$pass",1);'
Что ты, право, как маленький.

А вот root-пароль открытым текстом писать и передавать — это хрестоматийный случай добровольного защемления мошонки дверью. Впрочем, кто я такой, чтобы кого-то поучать.

beresk_let ★★★★★
()
Последнее исправление: beresk_let (всего исправлений: 1)
Ответ на: комментарий от beresk_let

спасибо большое,ошибка теперь не возникает. Но, в базу записывает не данные из переменной $IP либо $pass, а сами эти переменные! Не подскажите, как исправить?

MrSullex
() автор топика
Ответ на: комментарий от MrSullex

А это уже я, в свою очередь, опростоволосился с одинарными кавычками.

"INSERT INTO `game`.`locations` VALUES (3,\"Локация #1\",\"$IP\",\"$IP\",\"root\",\"$pass\",1);"
Только объясни, почему у тебя
`game`.`locations`
Это команды, которые нужно выполнить? Если нет, тоже кавычки замени на экранированные двойные.

beresk_let ★★★★★
()
Ответ на: комментарий от beresk_let

это запись в базу данных game в таблицу locations.

MrSullex
() автор топика
Ответ на: комментарий от MrClon

Я сходу не смогу назвать, в каком окружении две пары последовательных одинаковых кавычек и две пары таких же вложенных корректно различаются без экранирования.

beresk_let ★★★★★
()
Последнее исправление: beresk_let (всего исправлений: 1)
Ответ на: комментарий от beresk_let

в общем вот как я сделал.

echo "INSERT INTO "game"."locations" ("location_id", "location_name", "location_ip", "location_ip2", "location_user", "location_password", "location_status") VALUES (3,\"Location #1\",\"$IP\",\"$IP\",\"root\",\"$pass\",1);" | mysql -uroot -p$rootmysqlpass

Сработает?

MrSullex
() автор топика
Ответ на: комментарий от beresk_let

Сработало! Спасибо большое за помощь))

MrSullex
() автор топика
Ответ на: комментарий от beresk_let

правда теперь другая часть кода отказалась работать :D

MrSullex
() автор топика
Ответ на: комментарий от beresk_let

исправил,опять была проблема в кавычках)

MrSullex
() автор топика
Ответ на: комментарий от beresk_let

Я не про то, я про в целом.
Третий пистон например:

print('INSERT INTO `game`.`locations` VALUES (3,"Локация #1","{0}","{0}","root","{1}",1);'.format('127.0.0.1', 'Qwerty1'))

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

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

beresk_let ★★★★★
()
Ответ на: комментарий от beresk_let

mysql то теперь работает,а вот код

sed -i 's/dbpass/${ROOTMYSQL}/g' /var/www/application/config.php
sed -i 's/mydomain/${IP}/g' /var/www/application/config.php
Опять таки,записывает переменную в файл. А если кавычки заменить на «» то вообще ничего не записывает..

MrSullex
() автор топика
Ответ на: комментарий от MrSullex
sed -i -e "s/dbpass/${ROOTMYSQL}/g"

Ты бы мануалы хоть почитал или погуглил, прежде чем за каждой мелочью на ЛОР бегать. Сегодня тебе отвечаю добрый я, которому лень злиться и обзывать тебя школьником, а завтра напорешься на какого-нибудь Хвостострела, который закидает кирпичами. По возможности избегай этого.

beresk_let ★★★★★
()
Ответ на: комментарий от beresk_let

я вам о чем, кавычки у меня как вы поставили, ничего не меняет! если одинарные,то заливает переменную. Видимо я накосячил в запросе,что то с кавычками не то. а на счет школьника, причем тут это? просто я только начинаю изучать bash.

MrSullex
() автор топика
Ответ на: комментарий от beresk_let

имеете ввиду так экранировать, или как?

echo \"INSERT INTO \"game\".\"locations\" ("location_id", "location_name", "location_ip", "location_ip2", "location_user", "location_password", "location_status") VALUES (3,\"Location #1\",\"$IP\",\"$IP\",\"root\",\"$pass\",1);\" | mysql -uroot -p$rootmysqlpass

MrSullex
() автор топика
Ответ на: комментарий от MrSullex

как то так?

echo "INSERT INTO \"game\".\"users\" (\"user_id\", \"user_email\", \"user_password\", \"user_firstname\", \"user_lastname\", \"user_status\", \"user_balance\", \"user_access_level\", \"user_date_reg\") VALUES (NULL, \"adm@examle.com\", \"a66abb5684c45962d887564f08346e8d\", \"Admin\", \"Admin\", \"1\", \"5000.00\", \"3\", \"2014-02-19 00:00:00\");" | mysql -uroot -p$rootmysqlpass

MrSullex
() автор топика
Ответ на: комментарий от beresk_let

теперь выдает

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"game"."users" ("user_id", "user_email", "user_password", "user_firstname", "use' at line 1

MrSullex
() автор топика

Если все таки хочешь backticks, так нужно их эскейпить

echo "INSERT INTO \
\`game\`.\`locations\` \
SET \
\`location_id\` = 3, \
\`location_name\` = 'Location #1', \
\`location_ip\` = '$IP', \
\`location_ip2\` = '$IP', \
\`location_user\` = 'root', \
\`location_password\` = '$pass', \
\`location_status\` = 1;"

kiotoze ★★★★
()
Ответ на: комментарий от MrSullex

а на счет школьника, причем тут это? просто я только начинаю изучать bash

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

P.S. А еще, некоторые начинают предложения с большой буквы, всячески соблюдают другие правила русского языка — из уважения с собеседнику.

CrossFire ★★★★★
()
Последнее исправление: CrossFire (всего исправлений: 1)
Ответ на: комментарий от beresk_let

И это как-то противоречит моему замечанию про форматирование строк в баше?

Задача тут, кстати, вполне башевская. Расчехлять для неё питон кажется излишним. И тем обиднее что её решение на баше сопряжено с подобными дополнительными неудобствами.

P.S.

echo 'INSERT INTO `game`.`locations` VALUES (3,"Локация #1","{0}","{0}","root","{1}",1); #пистон не нужен' | sed "s/{0}/$ip/g" | sed "s/{1}/$pass/g"

MrClon ★★★★★
()
Ответ на: комментарий от kiotoze

вот так можно?

echo "INSERT INTO \
\`game\`.\`users\` \
SET \
\`user_id\` = 1, \
\`user_email\` = 'adm@examle.com', \
\`user_password\` = 'a66abb5684c45962d887564f08346e8d', \
\`user_firstname\` = 'Admin', \
\`user_lastname\` = 'Admin', \
\`user_status\` = 1, \
\`user_balance\` = 5000, \
\`user_access_level\` = 3, \
\`user_date_reg\` = '2014-02-19 00:00:00';" | mysql -uroot -p$rootmysqlpass

Меня смущает ';" в конце.

MrSullex
() автор топика
Ответ на: комментарий от MrClon

Я, в общем-то, не спорил с тобой и не защищал баш. Просто по моим ощущениям, ТС на баше колхозит что-то, что на баше колхозить лучше не стоит, и мои замечания насчёт языка программирования относились именно к этому.

beresk_let ★★★★★
()
Ответ на: комментарий от beresk_let

сложно объяснить? Вот этот код выполняется не корректно,с кавычками то все верно!!

echo "INSERT INTO \
\`game\`.\`locations\` \
SET \
\`location_id\` = 3, \
\`location_name\` = 'Location #1', \
\`location_ip\` = '$IP', \
\`location_ip2\` = '$IP', \
\`location_user\` = 'root', \
\`location_password\` = '$pass', \
\`location_status\` = 1;" | mysql -uroot -p$rootmysqlpass

sed -i "s/dbpass/${ROOTMYSQL}/g" /var/www/application/config.php
sed -i "s/mydomain/${IP}/g" /var/www/application/config.php

В базу заливается,а sed не меняет строки! а если убрать запрос к бд,то меняет.

MrSullex
() автор топика
Ответ на: комментарий от kiotoze

ну вот в базу все отлично заливается,но почему-то теперь не выполняется sed.

sed -i "s/dbpass/${ROOTMYSQL}/g" /var/www/application/config.php
sed -i "s/mydomain/${IP}/g" /var/www/application/config.php

Результат

sed: -e expression #1, char 13: unknown option to `s'

MrSullex
() автор топика
Ответ на: комментарий от beresk_let

я по всяческому пытался,но не выходит! дайте уже пожалуйста готовый код,если я рукожоп такой!

MrSullex
() автор топика
Ответ на: комментарий от MrClon

Кстати, у тебя переменные в sed не окавычены, а это верные грабли. Что будешь делать, если у тебя в

"${pass}"
попадётся, к примеру,
/g" sed -e "s/.*/DROP DATABASE default

beresk_let ★★★★★
()
Ответ на: комментарий от beresk_let

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

MrSullex
() автор топика
Ответ на: комментарий от beresk_let

Если трэшовых данных нет — вполне башевская. Например если скрипт нужен только для упрощения рутинных действий админа.

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

Но ведь очевидно, что в данном случае передаётся пароль. В пароле (в отличие, скажем, от IP) может быть что угодно, и даже валидацию вменяемым образом не прикрутить (кроме ущербных вариантов в духе «пароль должен содержать не больше N знаков из заданного списка»).

beresk_let ★★★★★
()
Ответ на: комментарий от beresk_let

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

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

В общем для поделок предназначенных для личного использования это вполне приемлемо, хотя и не по феньшю.

Даже для личного использования не очень годиться. Забудешь со временем, пасс поменяеш, а потом голову мучать будешь какого не работает то что работало, лучше сразу нормально сделать.

anc ★★★★★
()
Ответ на: комментарий от anc

Ошибка будет вполне красноречивой. Что-то вроде «mysql: неверный юзернэйм или пароль».
Кстати а как правильно из скрипта подключаться к мускулю, если не через хранящийся в скрипте или в отдельном конфиге пароль? Ну кроме того что нужно использовать не-рутовую учётку мускуля для банального инсерта инфы.

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

Ошибка будет вполне красноречивой. Что-то вроде «mysql: неверный юзернэйм или пароль».

Я про выше указанную конструкцию где подставляется переменная pass в текст запроса, а не про пароль к муське. О чем собственно писал beresk_let. Только он про одну сторону граблей т.е. про кавычки у переменной, но это не спасет если опять же в переменной pass будет «чуть другая» конструкция которая так же уйдет в запрос.

anc ★★★★★
()
Ответ на: комментарий от beresk_let

Ну этот пункт вообще не оспорим. Я на нем и не акцентировал внимание.

anc ★★★★★
()
Ответ на: комментарий от MrClon

Кстати а как правильно из скрипта подключаться к мускулю

правильно аутентифицироваться и авторизироваться тикетом от кербероса. но это не для домашнего использования по понятным причинам.

val-amart ★★★★★
()
Ответ на: комментарий от MrClon

имхо если уж делать на баше то чище через printf builtin, он и в переменную сразу может положить вывод без дополнительного экранирования. для себя написал простую утилиту которая дает доступ к питонячьему форматированию из шелла.

val-amart ★★★★★
()
Ответ на: комментарий от MrClon

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

val-amart ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.