2010-12-07 5 views
0

OK en essayant d'écrire une requête SQL dans un fichier texte. J'ai essayé chat, et écho pas de chance.Bash écrire dans un fichier (variables?)

Heres ce que je voudrais écrire dans le fichier:

USE vsftpd; 
    CREATE TABLE `accounts` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
    `username` VARCHAR(30) NOT NULL , 
    `pass` VARCHAR(50) NOT NULL , 
    UNIQUE (
    `username` 
    ) 

) ENGINE = MYISAM ; 

quit; 

ce que je reçois lorsque vous utilisez un chat ou d'écho (peut-être je besoin d'une sorte de switch?):

USE vsftpd; 
CREATE TABLE (
uid=0(root) gid=0(root) groups=0(root) INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
VARCHAR(30) NOT NULL , 
VARCHAR(50) NOT NULL , 
UNIQUE (

) 
) ENGINE = MYISAM ; 

quit; 
+0

Il serait utile que vous nous avez montré la commande exacte que vous avez essayé de utilisation! –

Répondre

1

Si vous exécutez des choses avec des accents graves dans la coquille, il évaluera les commandes jointes dans` `. Donc, une façon de le faire est d'utiliser une seule citation comme ceci:

$ echo ' USE vsftpd; 
    CREATE TABLE `accounts` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
    `username` VARCHAR(30) NOT NULL , 
    `pass` VARCHAR(50) NOT NULL , 
    UNIQUE (
    `username` 
    ) 

) ENGINE = MYISAM ; 

quit; 
' > file.sql 

$ more file.sql # verify content is correct 
+0

Merci de m'avoir montré la différence entre les guillemets simples et doubles;) J'utilisais " – jmituzas

2

Il est difficile de dire comment résoudre ce problème sans voir la commande exacte que vous utilisez, mais je suppose que le shell fait backquote substitution sur votre texte. Alors, où vous avez

CREATE TABLE `accounts` 

bash tente d'exécuter accounts comme une commande, et remplacer le texte backquoted avec la sortie standard de la commande. Et comme il n'y a probablement pas de commande dans votre chemin, la section rétropolée disparaît dans la sortie.

Essayez échapper chaque `personnage avec une barre oblique inverse, comme ceci:

CREATE TABLE \`accounts\` 
+0

Wow, c'était un peu une corvée à rendre dans Markdown! Finalement, il a dû abandonner le formatage en ligne et le faire comme des blocs, à la place. Probablement pas assez d'antislashs (ils sont comme la violence ... si cela ne résout pas votre problème, vous n'utilisez probablement pas assez.) –

0

pense que de toute façon je peux poster tout ça maintenant au cas où quelqu'un d'autre utilise là-bas et vous vsftpd m'a aidé. Heres le script pour vsftpd avec MySQL pour users.Everything virtuelle ici que la création de nouveaux utilisateurs que vous pouvez comprendre comment écrire que de ce qui est donné:

#!/bin/bash 

while [[ "$yn" != "Yes" && "$yn" != "Y" && "$yn" != "y" && "$yn" != "yes" ]]; do 
echo "name for your root password for MySQL" 
read rpsql 
echo "name for your primary FTP user" 
read puftp 
echo "what's you ftp password?" 
read pftp 
echo "what's the IPaddress of this server?" 
read fip 
echo "What is the Hostname of this server?" 
read fhost 
    echo "You have entered $rpsql as your MySQL password" 
    echo "You have entered $puftp as your FTP user" 
    echo "You have entered $pftp as your Primary FTP password" 
    echo "You have entered $fip as your IP address" 
    echo "You have entered $fhost as your hostname" 
    echo "Are all of these correct? (Yes or No)" 
     read yn 
done 

echo '######################################################################' 
echo '##### Installing, configuring, and creating FTP Users and Shares #####' 
echo '######################################################################' 

apt-get install vsftpd libpam-mysql mysql-client phpmyadmin 

mysqladmin -h nexwrxdemo.com -u root password $rpsql 

echo 'CREATE DATABASE vsftpd; 
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO '$puftp'@'localhost' IDENTIFIED BY '$pftp'; 
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO '$puftp'@'localhost.localdomain' IDENTIFIED BY '$pftp'; 
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO '$puftp'@'$fip' IDENTIFIED BY '$pftp'; 
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO '$puftp'@'$fhost' IDENTIFIED BY '$pftp'; 
FLUSH PRIVILEGES; 

USE vsftpd; 
    CREATE TABLE `accounts` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
    `username` VARCHAR(30) NOT NULL , 
    `pass` VARCHAR(50) NOT NULL , 
    UNIQUE (
    `username` 
    ) 

) ENGINE = MYISAM ; 

quit; ' > vsftpd.db 

echo "granting permissions to 'vsftpd' on database 'vsftpd'" 

mysql -u root -p$rpsql < vsftpd.db 

echo "creating a non-privileged user called 'vsftp' (with the homedir /home/vsftpd) belonging to the group 'nogroup'" 

useradd --home /home/$puftp --gid nogroup -m --shell /bin/false $puftp 

echo "configuring vsftpd" 
echo "backing up vsftpd config file" 

cp -r -f -p /etc/vsftpd.conf /backups/ 
cat /dev/null > /etc/vsftpd.conf 

echo 'listen=YES 
anonymous_enable=NO 
local_enable=YES 
write_enable=YES 
local_umask=022 
dirmessage_enable=YES 
xferlog_enable=YES 
connect_from_port_20=YES 
nopriv_user=vsftpd 
chroot_local_user=YES 
secure_chroot_dir=/var/run/vsftpd 
pam_service_name=vsftpd 
rsa_cert_file=/etc/ssl/certs/vsftpd.pem 
guest_enable=YES 
guest_username=vsftpd 
local_root=/home/vsftpd/$USER 
user_sub_token=$USER 
virtual_use_local_privs=YES 
user_config_dir=/etc/vsftpd_user_conf 
' > /etc/vsftpd.conf 

mkdir /etc/vsftpd_user_conf 

echo "backing up pam/vsftpd config file" 

cp -r -f -p /etc/pam.d/vsftpd /orig-config/ 
cat /dev/null > /etc/pam.d/vsftpd 

echo "auth required pam_mysql.so user=$puftp passwd=$psql host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2 
account required pam_mysql.so user=$puftp passwd=$psql host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2" > /etc/pam.d/vsftpd 

/etc/init.d/vsftpd restart 
#may be service vsftpd restart 

echo "setting up ftp admin & standard users for websites" 
echo "adding new users to ftp database" 
+0

Si vous voulez créer un fichier vide ou vider un fichier existant, vous n'avez pas besoin d'utiliser' cat/dev/null', il suffit d'utiliser '> filename'. Et il n'y a vraiment aucune raison de le faire puisque votre prochaine commande dans chaque cas va créer/écraser le fichier (puisque vous n'êtes pas ajouté avec '>>'). –

+0

Merci, encore en train d'apprendre. Chaque bit aide! – jmituzas

Questions connexes