1
+ { @author: Sylvain Maltais ([email protected] )
2
+ @created: 2024
3
+ @website(https://www.gladir.com/freebsd-0)
4
+ @abstract(Target: Turbo Pascal 7, Free Pascal 3.2)
5
+ }
6
+
7
+ Program CHSH;
8
+
9
+ Uses DOS;
10
+
11
+ Var
12
+ ModeParam:(_None,_Root,_Shell);
13
+ I:Integer;
14
+ ChangeDOS,ChangeRoot,ChangeShell:Boolean;
15
+ UserName,RootName,ShellName:String;
16
+
17
+ Function StrToUpper (S:String):String;
18
+ Var
19
+ I:Byte;
20
+ Begin
21
+ For I:=1 to Length(S)do Begin
22
+ If S[I] in [' a' ..' z' ]Then S[I]:=Chr(Ord(S[I])-32 );
23
+ End ;
24
+ StrToUpper:=S;
25
+ End ;
26
+
27
+ Function FileExist (Name :String):Boolean;
28
+ Var
29
+ Rec:SearchRec;
30
+ Begin
31
+ FindFirst(Name ,AnyFile,Rec);
32
+ FileExist:=DosError=0 ;
33
+ End ;
34
+
35
+ Function ChangeUserShell (UserOrID,Root,ShellName:String;ChangeRoot,ChangeShell:Boolean):Boolean;
36
+ Var
37
+ FilePasswd,NewFilePasswd:Text;
38
+ I,J,CellPos:Integer;
39
+ UserFound:Boolean;
40
+ CurrLine,CurrWord:String;
41
+ Cells:Array [0 ..10 ]of String;
42
+ Begin
43
+ ChangeUserShell:=False;
44
+ { $I-} Assign(FilePasswd,' /etc/passwd' );
45
+ Reset(FilePasswd);{ $I+}
46
+ If IOResult<>0 Then Begin
47
+ WriteLn(' Impossible de lire le fichier /etc/passwd' );
48
+ Halt(1 );
49
+ End ;
50
+ { $I-} Assign(NewFilePasswd,' /etc/passwd.tmp' );
51
+ Rewrite(NewFilePasswd);{ $I+}
52
+ If IOResult<>0 Then Begin
53
+ WriteLn(' Impossible de cr‚er un nouveau fichier /etc/passwd' );
54
+ Halt(2 );
55
+ End ;
56
+ While Not EOF(Filepasswd)do Begin
57
+ UserFound:=False;
58
+ ReadLn(Filepasswd,CurrLine);
59
+ FillChar(Cells,SizeOf(Cells),0 );
60
+ CurrWord:=' ' ;
61
+ CellPos:=0 ;
62
+ For I:=1 to Length(CurrLine) do Begin
63
+ If CurrLine[I]=' :' Then Begin
64
+ Cells[CellPos]:=CurrWord;
65
+ CurrWord:=' ' ;
66
+ Inc(CellPos);
67
+ If CellPos>9 Then Break;
68
+ End
69
+ Else
70
+ CurrWord:=CurrWord+CurrLine[I];
71
+ End ;
72
+ If CurrWord<>' ' Then Begin
73
+ Cells[CellPos]:=CurrWord;
74
+ Inc(CellPos);
75
+ End ;
76
+ If Cells[0 ]<>' ' Then Begin
77
+ If (Cells[0 ]=UserOrID)or (Cells[2 ]=UserOrID)Then Begin
78
+ UserFound:=True;
79
+ ChangeUserShell:=True;
80
+ End ;
81
+ End ;
82
+ If (UserFound)Then Begin
83
+ For J:=0 to 4 do Write(NewFilepasswd,Cells[J],' :' );
84
+ If (ChangeRoot)Then Write(NewFilepasswd,Root,' :' )
85
+ Else Write(NewFilepasswd,Cells[5 ]);
86
+ If (ChangeShell)Then Write(NewFilepasswd,ShellName)
87
+ Else Write(NewFilepasswd,Cells[6 ]);
88
+ WriteLn(NewFilepasswd);
89
+ End
90
+ Else
91
+ WriteLn(NewFilepasswd,CurrLine);
92
+ End ;
93
+ Close(NewFilepasswd);
94
+ Close(FilePasswd);
95
+ Assign(FilePasswd,' /etc/passwd' );
96
+ { $I-} Erase(FilePasswd);{ $I+}
97
+ If IOResult<>0 Then Begin
98
+ WriteLn(' Impossible de remplacer le fichier /etc/passwd' );
99
+ Halt(3 );
100
+ End ;
101
+ Assign(NewFilepasswd,' /etc/passwd.tmp' );
102
+ Rename(NewFilepasswd,' /etc/passwd' );
103
+ End ;
104
+
105
+ Procedure ShowListShells (DOSMode:Boolean);
106
+ Const
107
+ CorailCmds:Array [0 ..15 ]of String[12 ]=(
108
+ ' 4DOS.EXE' ,' AMIGADOS.EXE' ,' AMIGADOS.EXE' ,' APPLEDOS.EXE' ,
109
+ ' BASH.EXE' ,' BASH.EXE' ,' COMMAND.EXE' ,' CSH.EXE' ,' DRDOS.EXE' ,
110
+ ' KSH.EXE' ,' OS2CMD.EXE' ,' OS9.EXE' ,' PS.EXE' ,' PS.EXE' ,' SH.EXE' ,
111
+ ' TRSDOS.EXE'
112
+ );
113
+ Var
114
+ ListShells:Text;
115
+ I:Integer;
116
+ CurrLine,Corail:String;
117
+ Begin
118
+ If (DOSMode)Then Begin
119
+ WriteLn(' \COMMAND.COM' );
120
+ { 4DOS install‚ ? }
121
+ If FileExist(' \4DOS\4DOS.COM' )Then WriteLn(' \4DOS\4DOS.COM' );
122
+ { NDOS du Norton Utilities install‚ ? }
123
+ If FileExist(' \NU\NDOS.COM' )Then WriteLn(' \NU\NDOS.COM' );
124
+ { Les interpr‚teurs de commandes de Corail install‚ ? }
125
+ Corail:=GetEnv(' CORAIL' );
126
+ If Corail=' ' Then Corail:=' \CORAIL' ;
127
+ If Corail[Length(Corail)]<>' \' Then Corail:=Corail+' \' ;
128
+ For I:=Low(CorailCmds) to High(CorailCmds)do Begin
129
+ If FileExist(Corail+CorailCmds[I])Then WriteLn(Corail,CorailCmds[I]);
130
+ End ;
131
+ End
132
+ Else
133
+ Begin
134
+ { $I-} Assign(ListShells,' /etc/shells' );
135
+ Reset(ListShells);{ $I+}
136
+ If IOResult<>0 Then Begin
137
+ WriteLn(' Impossible de lire le fichier /etc/shells' );
138
+ Halt(6 );
139
+ End ;
140
+ While Not EOF(ListShells)do Begin
141
+ ReadLn(ListShells,CurrLine);
142
+ WriteLn(CurrLine);
143
+ End ;
144
+ Close(ListShells);
145
+ End ;
146
+ End ;
147
+
148
+ Function ChangeDOSShell (ShellName:String):Boolean;
149
+ Var
150
+ ConfigFile,NewConfigFile:Text;
151
+ I:Integer;
152
+ Found,ShellHigh:Boolean;
153
+ CurrLine,CurrWord:String;
154
+ Begin
155
+ ChangeDOSShell:=False;
156
+ { $I-} Assign(ConfigFile,' \CONFIG.SYS' );
157
+ Reset(ConfigFile);{ $I+}
158
+ If IOResult<>0 Then Begin
159
+ { $I-} Rewrite(ConfigFile);{ $I+}
160
+ If IOResult<>0 Then Begin
161
+ WriteLn(' Impossible de lire ou de cr‚er un nouveau fichier \CONFIG.SYS' );
162
+ Halt(1 );
163
+ End ;
164
+ WriteLn(ConfigFile,' Shell=' ,ShellName);
165
+ Close(ConfigFile);
166
+ Exit;
167
+ End ;
168
+ { $I-} Assign(NewConfigFile,' /CONFIG.NEW' );
169
+ Rewrite(NewConfigFile);{ $I+}
170
+ If IOResult<>0 Then Begin
171
+ WriteLn(' Impossible de cr‚er un nouveau fichier \CONFIG.SYS' );
172
+ Halt(2 );
173
+ End ;
174
+ While Not EOF(ConfigFile)do Begin
175
+ ReadLn(ConfigFile,CurrLine);
176
+ CurrWord:=' ' ;
177
+ Found:=False;
178
+ For I:=1 to Length(CurrLine)do Begin
179
+ If CurrLine[I]=' =' Then Begin
180
+ If StrToUpper(CurrWord)=' SHELL' Then Begin
181
+ Found:=True;
182
+ ShellHigh:=False;
183
+ End
184
+ Else
185
+ If StrToUpper(CurrWord)=' SHELLHIGH' Then Begin { DR-DOS ? }
186
+ Found:=True;
187
+ ShellHigh:=True;
188
+ End ;
189
+ End
190
+ Else
191
+ CurrWord:=CurrWord+CurrLine[I];
192
+ End ;
193
+ If (Found)Then Begin
194
+ If (ShellHigh)Then WriteLn(NewConfigFile,' ShellHigh=' ,ShellName)
195
+ Else WriteLn(NewConfigFile,' Shell=' ,ShellName);
196
+ End
197
+ Else
198
+ WriteLn(NewConfigFile,CurrLine);
199
+ End ;
200
+ Close(NewConfigFile);
201
+ Close(ConfigFile);
202
+ Assign(ConfigFile,' \CONFIG.SYS' );
203
+ { $I-} Erase(ConfigFile);{ $I+}
204
+ If IOResult<>0 Then Begin
205
+ WriteLn(' Impossible de remplacer le fichier \CONFIG.SYS' );
206
+ Halt(3 );
207
+ End ;
208
+ Assign(NewConfigFile,' \CONFIG.NEW' );
209
+ Rename(NewConfigFile,' \CONFIG.SYS' );
210
+ End ;
211
+
212
+ BEGIN
213
+ If (ParamStr(1 )=' /?' )or (ParamStr(1 )=' --help' )or (ParamStr(1 )=' -h' )or
214
+ (ParamStr(1 )=' /h' )or (ParamStr(1 )=' /H' )Then Begin
215
+ WriteLn(' CHSH : Cette commande permet de changer l'' interpr‚teur ' ,
216
+ ' de commande par d‚faut.' );
217
+ WriteLn;
218
+ WriteLn(' Syntaxe : chsh [option] [-R root] [ -s login_shell] user' );
219
+ WriteLn(' chsh --dos -s login_shell ' );
220
+ WriteLn;
221
+ WriteLn(' user Indique le nom de l'' utilisateur' );
222
+ WriteLn(' -l Affiche la liste des interpr‚teurs de commande ' );
223
+ WriteLn(' disponibles' );
224
+ WriteLn(' -R root Indique le chemin du root de l'' utilisateur' );
225
+ WriteLn(' -s login-shell Indique le nom de l'' interpr‚teur de commande' );
226
+ WriteLn(' --dos Indique qu'' il faut changer l'' interpr‚teur de commande DOS' );
227
+ WriteLn(' --help Affiche l'' aide sur cette commande' );
228
+ WriteLn(' --list-shells Affiche la liste des interpr‚teurs de commande ' );
229
+ WriteLn(' disponibles' );
230
+ WriteLn(' --root root Indique le chemin du root de l'' utilisateur' );
231
+ WriteLn(' --shell login-shell Indique le nom de l'' interpr‚teur de commande' );
232
+ End
233
+ Else
234
+ If (ParamStr(1 )=' -v' )or (ParamStr(1 )=' --version' )Then Begin
235
+ WriteLn(' CHSH 1.1 - Clone Pascal de shadow-utils, linux, freebsd, ' ,
236
+ ' xenix ou corail' );
237
+ WriteLn(' Licence MIT' );
238
+ WriteLn;
239
+ WriteLn(' crit par Sylvain Maltais' );
240
+ End
241
+ Else
242
+ Begin
243
+ ChangeRoot:=False;
244
+ ChangeShell:=False;
245
+ ChangeDOS:=False;
246
+ ModeParam:=_None;
247
+ RootName:=' ' ;
248
+ ShellName:=' ' ;
249
+ UserName:=' ' ;
250
+ For I:=1 to ParamCount do Begin
251
+ Case ModeParam of
252
+ _Root:Begin
253
+ RootName:=ParamStr(I);
254
+ ModeParam:=_None;
255
+ ChangeRoot:=True;
256
+ End ;
257
+ _Shell:Begin
258
+ ShellName:=ParamStr(I);
259
+ ModeParam:=_None;
260
+ ChangeShell:=True;
261
+ End ;
262
+ Else Begin
263
+ If (ParamStr(I)=' --dos' )Then ChangeDOS:=True Else
264
+ If (ParamStr(I)=' -l' )or (ParamStr(I)=' --list-shells' )Then Begin
265
+ ShowListShells(ChangeDOS);
266
+ Halt;
267
+ End
268
+ Else
269
+ If (ParamStr(I)=' -R' )or (ParamStr(I)=' --root' )Then ModeParam:=_Root Else
270
+ If (ParamStr(I)=' -s' )or (ParamStr(I)=' --shell' )Then ModeParam:=_Shell
271
+ Else UserName:=ParamStr(I);
272
+ End ;
273
+ End ;
274
+ End ;
275
+ If (ChangeDOS)Then Begin
276
+ If ChangeDOSShell(ShellName)Then Begin
277
+ WriteLn(' Impossible de changer l'' interpr‚teur de commande DOS !' );
278
+ Halt(6 );
279
+ End ;
280
+ End
281
+ Else
282
+ If (ChangeRoot)or (ChangeShell)Then Begin
283
+ If UserName=' ' Then Begin
284
+ WriteLn(' Nom d'' utilisateur requis !' );
285
+ Halt(3 );
286
+ End ;
287
+ If Not ChangeUserShell(UserName,RootName,ShellName,ChangeRoot,ChangeShell)Then Begin
288
+ WriteLn(' Utilisateur introuvable !' );
289
+ Halt(5 );
290
+ End ;
291
+ End
292
+ Else
293
+ Begin
294
+ WriteLn(' Un root et/ou le shell est requis !' );
295
+ Halt(4 );
296
+ End ;
297
+ End ;
298
+ END .
0 commit comments