1

Sorry if the title is a little bit confusing but basically im trying to make a command that will change the default shell of a user.

The user just needs to call the command (btb) and input the username e.g. btb USERNAME btb being args[0] and USERNAME being args[1]. Now i need to make this into one string so that i can use it to make a system call system("chsh -s /bin/bash USERNAME").

So far i have this

int Registerbtb(char **args)
{
  char command[50];
  strcpy(command, args[1]);
  system(command);
  return 1;
}

which is only taking the args[1] and putting that into command. But i need it to do is strcpy(command, ("chsh -s /bin/bash %s", args[1])); but that isnt possible.

What other way can i do this so that command will have the string "chsh -s /bin/bash USERNAME" in it

Recap
  • 168
  • 2
  • 15

1 Answers1

1

strcpy is not the function you're looking for. You should instead use snprintf with a buffer to hold your string, if you know the size:

char buf[50];
snprintf(buf, sizeof(buf), "chsh -s /bin/bash %s", args[1]);

Keep in mind this above example suffers from a potential bug where the string will be truncated.

If you don't know the size of the username in beforehand you can call snprintf twice to dynamically allocate memory for your string, here is an example program.

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main(int argc, char **args) {
  char *str;

  // TODO check if argc is equal to one

  int length = snprintf(NULL, 0, "chsh -s /bin/bash %s", args[1]);
  assert(length >= 0); // TODO add proper error handling
  str = malloc(sizeof(char) * length);
  snprintf(str, length, "chsh -s /bin/bash %s", args[1]);

  printf("%s [%d]\n", str, length); // do something with the str
  free(str);
}

Or if you have it available on your system you can just use asprintf to save you from an headache.

Linus
  • 1,516
  • 17
  • 35
  • @Recap Great, remember to be careful if you use the example with a static buffer (I recommend to use asprintf, but you will have to set the preprocessor `_GNU_SOURCE` for it to work). – Linus Oct 30 '15 at 23:35