Skip to content

Commit 78bae83

Browse files
author
Sylvain Maltais
committed
Ajout de la commande CHSH
1 parent 7099b92 commit 78bae83

File tree

1 file changed

+298
-0
lines changed

1 file changed

+298
-0
lines changed

CHSH.PAS

Lines changed: 298 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,298 @@
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

Comments
 (0)