Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² срСдС Linux. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 140

Автор Майкл ДТонсон

 42:    exit(1);

 43:   }

 44:  }

 45:

 46:  int main(int argc, const char ** argv) {

 47:   pam_handle_t * pamh;

 48:   struct passwd * pw;

 49:   char * username=NULL, * service=NULL;

 50:   int account = 1, session = 0;

 51:   int c;

 52:   poptContext optCon;

 53:   struct poptOption optionsTable[] = {

 54:    { "username", 'u', POPT_ARG_STRING, &username, 0,

 55:      "Имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ", "<имя_ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ>" },

 56:    { "service", 'S', РОPT_ARG_STRING, &service, 0,

 57:      "Имя слуТбы для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊ (pamsample)",

 58:      "<слуТба>" },

 59:    { "account", 'a', POPT_ARG_NONE|POPT_ARGFLAG_XOR,

 60:      &account, 0,

 61:      "Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅/Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ управлСния ΡƒΡ‡Π΅Ρ‚Π½Ρ‹ΠΌΠΈ записями (Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ)", "" },

 62:    { "session", 's', POPT_ARG_NONE|POPT_ARGFLAG_XOR,

 63:      &session, 0,

 64:      "Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅/Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ запуска сСанса (Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ)", "" },

 65:    POPT_AUTOHELP

 66:    POPT_TABLEEND

 67:   };

 68:

 69:   optCon = poptGetContext("pamexample", argc, argv,

 70:    optionsTable, 0);

 71:   if ((c = poptGetNextOpt(optCon)) < -1) {

 72:    fprintf(stderr, "%s: %s\n",

 73:    poptBadOption(optCon, POPT_BADOPTION_NOALIAS),

 74:    poptStrerror(c));

 75:    return 1;

 76:   }

 77:   poptFreeContext(optCon);

 78:

 79:   if (!service) {

 80:    /* ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ

 81:     * этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ; ΠΎΠ½ присутствуСт здСсь, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ

 82:     * ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½Π΅ производя ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² систСмС,

 83:     * Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… доступа root.

 84:     */

 85:   service = "pamexample";

 86:  }

 87:

 88:  if (!username) {

 89:   /* ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ */

 90:   if (!(pw = getpwuid (getuid())) ) {

 91:    fprintf(stderr, "Имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π΅ сущСствуСт");

 92:    exit(1);

 93:   }

 94:   username = strdup(pw->pw_name);

 95:  }

 96:

 97:  с = pam_start(service, username, &my_conv, &pamh);

 98:  check_success(pamh, c);

 99:

100:  с = pam_authenticate(pamh, 0);

101:  check_success(pamh, c);

102:

103:  if (account) {

104:   /* Ссли аутСнтификация Π½Π΅ Π±Ρ‹Π»Π° Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π°, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅

105:    * ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записью Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ

106:    */

107:   с = pam_acct_mgmt(pamh, 0);

108:   check_success(pamh, с);

109:  }

110:

111:  if (session) {

112:   /* Π’ случаС нСобходимости ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ здСсь Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅ */

113:   Ρ = pam_open_session(pamh, 0);

114:   check_success(pamh, с);

115:

116:   /* ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ здСсь Π½Π΅ устанавливаСтся uid, gid

117:      ΠΈΠ»ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ */

118:   с = pam_setcred(pamh, 0);

119:

120:   /* Π’ случаС нСобходимости ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ здСсь полномочия */

121:

122:   /* Π’Ρ‹Π·ΠΎΠ² ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, которая Π±Ρ‹Π»Π° "Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π°" */

123:   printf("Запуск ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ...\n");

124:   system("exec bash -");

125:

126:   /* Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ wait4(), Ссли Π±Ρ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Π»ΠΈ

127:      Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅ вмСсто Π²Ρ‹Π·ΠΎΠ²Π° system() */

128:   с = pam_close_session(pamh, 0);

129:   check_success(pamh, с);

130:  }

131:

132:  /* Π Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ прилоТСния ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎ сбоС вмСсто

133:   * Π²Ρ‹Ρ…ΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈ Π΄Π΅Π»Π°Π»ΠΈ Π² check_success Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ стадии,

134:   * поэтому Π² Ρ‚Π°ΠΊΠΈΡ… случаях с ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ значСния, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅

135:   * ΠΎΡ‚ PAM_SUCCESS.

136:   */

137:  с = pam_end(pamh, с);

138:  check_success(pamh, с);

139:

140:  return 0;

141: }

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ A

Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹

Π’ этом ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ всС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ для исходного ΠΊΠΎΠ΄Π°, рассмотрСнного Π² ΠΊΠ½ΠΈΠ³Π΅.

1: /* libhello.h */

2:

3: #ifndef LIBHELLO_H_

4: #define LIBHELLO_H_

5:

6: void print_hello(void);

7:

8: #endif /* LIBHELLO_H_ */


1: /* ptypair.h */

2:

3: #ifndef _PTYPAIR_H

4: #define _PTYPAIR_H

5: int get_master_pty(char **name);

6: int get_slave_pty(char *name);

7: #endif /* _PTYPAIR_H */


1: /* sockutil.h */

2:

3: void die(char * message);

4: void copyData(int from, int to);

5: #ifndef CMSG_DATA

6: #define CMSG_DATA (cmsg) ((cmsg)->cmsg_data)

7: #endif

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π‘

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ladsh

  1: /* ladsh4.c */

  2:

  3: #define _GNU_SOURCE

  4:

  5: #include <ctype.h>

  6: #include <errno.h>

  7: #include <fcntl.h>

  8: #include <glob.h>

  9: #include <signal.h>

 10: #include <stdio.h>

 11: #include <stdlib.h>

 12: #include <string.h>

 13: #include <sys/ioctl.h>

 14: #include <sys/wait.h>

 15: #include <unistd.h>

 16:

 17: #define MAX_COMMAND_LEN 250 /* максимальная Π΄Π»ΠΈΠ½Π° ΠΎΠ΄Π½ΠΎΠΉ

 18:                                ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки */

 19: #define JOB_STATUS_FORMAT "[%d] %-22s %.40s\n"

 20:

 21: struct jobSet {

 22:  struct job * head; /* Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ списка Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ Π·Π°Π΄Π°Π½ΠΈΠΉ */

 23:  struct job * fg; /* Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ высокоприоритСтноС Π·Π°Π΄Π°Π½ΠΈΠ΅ */

 24: };

 25:

 26: enum redirectionType { REDIRECT_INPUT, REDIRECT_OVERWRITE,

 27:                        REDIRECT_APPEND };

 28:

 29: struct redirectionSpecifier {

 30:  enum redirectionType type; /* Ρ‚ΠΈΠΏ пСрСадрСсации */

 31:  int fd;                    /* пСрСадрСсация fd */

 32:  char * filename;           /* Ρ„Π°ΠΉΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ пСрСадрСсовано fd */

 33: };

 34:

 35: struct childProgram {

 36:  pid_t pid;                                 /* 0 Π² случаС Π²Ρ‹Ρ…ΠΎΠ΄Π° */

 37:  char ** argv;                              /* имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ */

 38:  int numRedirections;                       /* элСмСнты Π² массивС пСрСадрСсации */

 39:  struct redirectionSpecifier* redirections; /* пСрСадрСсации Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° */

 40:  glob_t globResult;                         /* Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ унивСрсализации ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° */

 41:  int freeGlob;                              /* Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ globResult? */

 42:  int isStopped;                             /* выполняСтся Π»ΠΈ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°?*/

 43: };

 44:

 45: struct job {

 46:  int jobId;        /* Π½ΠΎΠΌΠ΅Ρ€ задания */

 47:  int numProgs;     /* количСство ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² Π·Π°Π΄Π°Π½ΠΈΠΈ */

 48:  int runningProgs; /* количСство Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ */

 49:  char * text;      /* имя задания */

 50:  char * cmdBuf;    /* Π±ΡƒΡ„Π΅Ρ€, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ массивы argv */

 51:  pid_t pgrp;       /* ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π³Ρ€ΡƒΠΏΠΏΡ‹ процСсса для задания */

 52:  struct childProgram* progs; /* массив ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² Π·Π°Π΄Π°Π½ΠΈΠΈ */

 53:  struct job* next; /* для отслСТивания Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ */

 54:  int stoppedProgs; /* количСство Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ…, Π½ΠΎ приостановлСнных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ */

 55: };

 56:

 57: void freeJob (struct job * cmd) {

 58:  int i;

 59:

 60:  for (i = 0; i <cmd->numProgs; i++) {

 61:   free(cmd->progs[i].argv);

 62:   if (cmd->progs[i].redirections)

 63:    free(cmd->progs[i].redirections);

 64:   if (cmd->progs[i].freeGlob)

 65:    globfree(&cmd->progs[i].globResult);

 66:  }

 67:  free(cmd->progs);

 68:  if (cmd->text) free(cmd->text);

 69:   free(cmd->cmdBuf);

 70: }

 71:

 72: int getCommand(FILE * source, char * command) {

 73:  if (source == stdin) {

 74:   printf("# ");

 75:   fflush(stdout);

 76:  }

 77:

 78:  if (!fgets(command, MAX_COMMAND_LEN, source)) {

 79:   if (source == stdin) printf("\n");

 80:   return 1;

 81:  }

 82:

 83:  /* ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ хвостового символа Π½ΠΎΠ²ΠΎΠΉ строки */

 84:  command[strlen(command) - 1] = '\0';

 85:

 86:  return 0;

 87: }

 88:

 89: void globLastArgument(struct childProgram * prog, int * argcPtr,

 90:  int * argcAllocedPtr) {

 91:  int argc = *argcPtr;

 92:  int argcAlloced = *argcAllocedPtr;

 93:  int rc;

 94:  int flags;

 95:  int i;

 96:  char * src, * dst;

 98:  if (argc>1) { /* cmd->globResult ΡƒΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ */

 99:   flags = GLOB_APPEND;

100:   i = prog->globResult.gl_pathc;

101:  } else {

102:   prog->freeGlob = 1;

103:   flags = 0;