kjclark62
kjclark62

Reputation: 21

Looping through file to create other command files

I am trying to create a script that will automatically log me in to a specific remote device (let's call it a fw). The "command" is a bit elaborate, as we are logging in from a protected network server, and there are hundreds of these to login to.

I have created a file with two parameters (command and name) separated by "#", the first parameter is the "command" string with spaces (ie: "sudo --user ....") which I want to put (echo) into an executeable file called "name" (name of the device I want to login to).

My logic was originally:

for line in $(awk -F# '{print $1, $2}'  list.txt), do touch $2; && echo "$1 > $2" && chmod +x $2; done

my end should create x number of files named "$name", each with only a one-line command of "$command" and be "executeable".

I have tried several things to make this work. I can iterate of the file with not much issue using for, while, and even [[ -n $name ]], but, this only provides me with one variable and doesn't split the line into the two I need, "$command" and "$name". Even $1 and $2 would be fine for my purposes...

While testing:

$ while IFS=# read -r line; do echo "$line"; done < list
 sudo --user xxxxxxxxxxxxxx#yyyyyyyyy
 sudo --user xxxxxxxxxxxxxx#yyyyyyyyy
 sudo --user xxxxxxxxxxxxxx#yyyyyyyyy

even using IFS=# to split the $line - doesn't remove the "#" as expected.

for-looping:

$ for line in $(cat list); do echo $line; done
 sudo --user xxxxxxxxxxxxxx
 yyyyyyyyy
  sudo --user xxxxxxxxxxxxxx
 yyyyyyyyy
  sudo --user xxxxxxxxxxxxxx
 yyyyyyyyy

Trying to expand to:

bin$  for line in $(cat list); do awk -F# '{print $1, $2}'  $line; done
awk: fatal: cannot open file ` xxxxxxxxxxxxxxxxx' for reading (No such file or directory)
awk: fatal: cannot open file `yyyyyyyyy
 sudo --user xxxxxxxxxxxxxxxxx' for reading (No such file or directory)
awk: fatal: cannot open file `yyyyyyyyy
 sudo --user xxxxxxxxxxxxxxxxx' for reading (No such file or directory)

I would like to parse (loop) through the file - separate the parms and create $name with $command inside and chmod +x $name to have an executeable that will log me in automatically to "$name" node.

Upvotes: 1

Views: 41

Answers (1)

Dudi Boy
Dudi Boy

Reputation: 4865

I suggest inserting all your logic into the awk script.

script.awk

BEGIN {FS = "[\r#]"}    # set field separator to # or <CR>
{                   # for each input line
    print $1 > $2;  # write input 1st field to file named 2nd field
    system("chmod a+x "$2); # set file named 2nd field, to be  executable
}

running the script:

awk -f script.awk list.txt

input list.txt

 sudo --user xxxxxxxxxxxxxx#yyyyyyyy1
 sudo --user xxxxxxxxxxxxxx#yyyyyyyy2
 sudo --user xxxxxxxxxxxxxx#yyyyyyyy3

output:

dudi@DM-840$ ls -l yy*
total 3
-rwxrwxrwx 1 dudi dudi   28 Jun 23 01:21 yyyyyyyy1*
-rwxrwxrwx 1 dudi dudi   28 Jun 23 01:21 yyyyyyyy2*
-rwxrwxrwx 1 dudi dudi   28 Jun 23 01:21 yyyyyyyy3*

update:

changed FS to include the <CR> char, otherwise appended to filenames (seen as ^M).

Upvotes: 1

Related Questions