Witam serdecznie. Mam mały problem. Potrzebuję za pomocą sshnet wysłać komendę na linuksową maszynę. Treść jaką maszyna musi odebrać to "cat /proc/cpuinfo |grep 'model name'|awk '{print $4" "$5" "$6" "$7" "$8" "$9}' head -n 1'" i tu mam problem. Oczywiście da się to zapisać tak żeby visual studio nie krzyczało za pomocą "" lub @ i ", jednak przy wysyłaniu przez klienta komendy są one tłumaczone na "cat /proc/cpuinfo |grep 'model name'|awk '{print $4 " "$5 " " $6" "$7 " " $8 " " $9}' head -n 1'" czego niestety linuksowa maszyna nie interpretuje.
Czy ktoś jest mi w stanie podpowiedzieć jak to ogarnąć. Dodam jeszcze tylko, że string jest zapisany w tablicy.
"a\x34a" == "a"a"
"cat /proc/cpuinfo |grep 'model name'|awk '{print $4 \x34 \x34 $5 \x34 \x34 $6 \x34 \x34 $7 \x34 \x34 $8 \x34 \x34 $9}' head -n 1'"; == "cat /proc/cpuinfo |grep 'model name'|awk '{print $4 4 4 $5 4 4 $6 4 4 $7 4 4 $8 4 4 $9}' head -n 1'"
@"cat /proc/cpuinfo |grep 'model name'|awk '{print $4 \x34 \x34 $5 \x34 \x34 $6 \x34 \x34 $7 \x34 \x34 $8 \x34 \x34 $9}' head -n 1'"; == "cat /proc/cpuinfo |grep 'model name'|awk '{print $4 \x34 \x34 $5 \x34 \x34 $6 \x34 \x34 $7 \x34 \x34 $8 \x34 \x34 $9}' head -n 1'"
Mały bug się wkradł tam pewnie miało być \x22 = " \x34 = 44 ;D
wynikiem nadal jest "cat /proc/cpuinfo |grep 'model name'|awk '{print $4 " " $5 " " $6 " " $7 " " $8 " " $9}' head -n 1'"
Bez znaków cudzysłowy zapytanie awk i tak przejdzie.
Jeśli wypisujesz tą tablice u siebie w terminalu i jest poprawna to znaczy, że sshnet musi parsować tego stringa.
Owszem, ale będzie to zlepek kilku wyrazów, co jest bez sensu. Cudzysłowy jednak miały na celu oddzielenie je od siebie
Oczywiście da się to zapisać tak żeby visual studio nie krzyczało za pomocą "" lub @ i ", jednak przy wysyłaniu przez klienta komendy są one tłumaczone
Pokaż kod jak to wysyłasz. Bo coś źle robisz.
C:\>copy con a.cs
class A { static void Main() {
System.Console.WriteLine(@"cat /proc/cpuinfo |grep 'model name'|awk '{print $4"" ""$5"" ""$6"" ""$7"
" ""$8"" ""$9}' head -n 1'");
} }
^Z
Liczba skopiowanych plików: 1.
C:\>csc a.cs /nologo
C:\>a
cat /proc/cpuinfo |grep 'model name'|awk '{print $4" "$5" "$6" "$7" "$8" "$9}' head -n 1'
C:\>
Ok, jest tak
class SshCommandList
{
public string SshCommandDictionary(string name)
{
Dictionary<string, string> command = new Dictionary<string, string>();
command["cpuInfo"] = @"cat /proc/cpuinfo |grep 'model name'|awk '{pprint $4"" ""$5"" ""$6"" ""$7}' head -n 1'";
command["core0Temp"] = "sensors |grep 'Core 0'|awk '{print $3}'";
command["core1Temp"] = "sensors |grep 'Core 1'|awk '{print $3}'";
command["core2Temp"] = "sensors |grep 'Core 2'|awk '{print $3}'";
command["core3Temp"] = "sensors |grep 'Core 3'|awk '{print $3}'";
command["gpuTemp"] = "sensors |grep 'temp1:'|awk '{print $2}'";
string errorValue = "";
if (command.ContainsKey(name))
{
errorValue = command[name];
}
else
{
errorValue = "Brak takiej komendy" + name.ToString();
}
return errorValue;
}
}
nastepnie uzywam tego w ten sposob
if (client.IsConnected)
{
List<Command> d = new List<Command>();
d.Add(new Command { Name = "core0Temp", sshCommand = command.SshCommandDictionary("core0Temp") });
d.Add(new Command { Name = "core1Temp", sshCommand = command.SshCommandDictionary("core1Temp") });
d.Add(new Command { Name = "gpuTemp", sshCommand = command.SshCommandDictionary("gpuTemp") });
d.Add(new Command { Name = "cpuInfo", sshCommand = command.SshCommandDictionary("cpuInfo") });
foreach (var x in d)
{
switch (x.Name)
{
case "core0Temp":
var core0 = client.CreateCommand(x.sshCommand);
core0Temp = core0.Execute().ToString();
break;
case "core1Temp":
var core1 = client.CreateCommand(x.sshCommand);
core1Temp = core1.Execute().ToString();
break;
case "gpuTemp":
var gpu = client.CreateCommand(x.sshCommand);
gpuTemp = gpu.Execute().ToString();
break;
case "cpuInfo":
var cpu = client.CreateCommand(x.sshCommand);
cpuInfo = cpu.Execute().ToString();
break;
default:
break;
}
}
}
i x.sshCommand (dla cpuInfo) == "cat /proc/cpuinfo |grep 'model name'|awk '{pprint $4" "$5" "$6" "$7}' head -n 1'"
Możesz zawartość komendy potraktować base64, przesyłać, zdalnie zdekodować i wykonać
marek2:~/workspace/files $ cat /proc/cpuinfo |grep 'model name'|awk '{print $4" "$5" "$6" "$7" "$8" "$9}'|head -n 1
Intel(R) Xeon(R) CPU @ 2.50GHz
marek2:~/workspace/files $ base64
cat /proc/cpuinfo |grep 'model name'|awk '{print $4" "$5" "$6" "$7" "$8" "$9}'|head -n 1Y2F0IC9wcm9jL2NwdWluZm8gfGdyZXAgJ21vZGVsIG5hbWUnfGF3ayAne3ByaW50ICQ0IiAiJDUi
ICIkNiIgIiQ3IiAiJDgiICIkOX0nfGhlYWQgLW4gMQ==
marek2:~/workspace/files $ echo Y2F0IC9wcm9jL2NwdWluZm8gfGdyZXAgJ21vZGVsIG5hbWUnfGF3ayAne3ByaW50ICQ0IiAiJDUiICIkNiIgIiQ3IiAiJDgiICIkOX0nfGhlYWQgLW4gMQ==|base64 -d|sh
Intel(R) Xeon(R) CPU @ 2.50GHz
Piękne dzięki, ten sposób działa jak należy. Pozdrawiam.