Skip to content

Instantly share code, notes, and snippets.

@divinity76
Created October 30, 2023 08:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save divinity76/d7061ba351b8e36445a83c15671e91d5 to your computer and use it in GitHub Desktop.
Save divinity76/d7061ba351b8e36445a83c15671e91d5 to your computer and use it in GitHub Desktop.
php script to shell command converter
#!/usr/bin/env php
<?php
declare(strict_types=1);
use function var_dump as d;
function dd(...$args)
{
$trace = debug_backtrace(0, 1)[0]; // odd, i really expected (0, 2)[1] ... but it works
$line = $trace['line'];
$file = $trace['file'];
echo "dd() called at {$file}:{$line}\n";
var_dump(...$args);
exit(1);
}
$file = $argv[1] ?? null;
if ($argc !== 2 || !is_file($file)) {
echo "Usage: php {$argv[0]} <file>\n";
exit(1);
}
$content = file_get_contents($file);
if (stripos($content, '<?php') === 0) {
//$content = substr($content, strlen('<?php'));
}
$decoded = token_get_all($content, TOKEN_PARSE);
//dd($decoded);
$finalCode = '';
$hasSpace = false;
$needSpace = false;
foreach ($decoded as $token) {
if(!is_array($token)) {
$needSpace = false;
$finalCode .= $token;
continue;
}
$tokenType = $token[0];
$tokenContent = $token[1];
$tokenLine = $token[2];
if(1 && $tokenType === T_WHITESPACE){
if($hasSpace || !$needSpace){
continue;
}
$hasSpace = true;
$finalCode .= " ";
continue;
}
if(in_array($tokenType, [T_COMMENT, T_DOC_COMMENT, T_WHITESPACE], true)) {
$needSpace = false;
continue;
}
$hasSpace = false;
$needSpace = in_array($tokenType, array(
// This list is probably buggy/incomplete
T_PUBLIC,
T_PROTECTED,
T_PRIVATE,
T_STATIC,
T_ABSTRACT,
T_FINAL,
T_CLASS,
T_FUNCTION,
T_INTERFACE,
T_USE,
T_NAMESPACE,
T_AS,
T_EXTENDS,
T_IMPLEMENTS,
T_CONST,
T_VAR,
T_GLOBAL,
T_INCLUDE,
T_INCLUDE_ONCE,
T_REQUIRE,
T_REQUIRE_ONCE,
T_RETURN,
T_THROW,
T_GOTO,
T_BREAK,
T_CONTINUE,
T_IF,
T_ELSEIF,
T_ELSE,
T_WHILE,
T_DO,
T_FOR,
T_FOREACH,
T_SWITCH,
T_CASE,
T_DEFAULT,
T_TRY,
T_CATCH,
T_FINALLY,
T_ECHO,
T_PRINT,
//T_UNSET,
//T_ISSET,
//T_EMPTY,
T_EVAL,
T_LIST,
//T_CLONE,
//T_EXIT,
//T_HALT_COMPILER,
T_YIELD,
T_YIELD_FROM,
T_INSTEADOF,
T_NEW,
T_OBJECT_OPERATOR,
T_DOUBLE_ARROW,
T_DOUBLE_COLON,
T_OBJECT_CAST,
T_ARRAY_CAST,
T_BOOL_CAST,
T_STRING_CAST,
T_DOUBLE_CAST,
T_INT_CAST,
//T_DEC,
//T_INC,
//T_POW,
//T_PLUS_EQUAL,
//T_MINUS_EQUAL,
//T_MUL_EQUAL,
//T_DIV_EQUAL,
//T_CONCAT_EQUAL,
T_MOD_EQUAL,
T_AND_EQUAL,
T_OR_EQUAL,
T_XOR_EQUAL,
T_SL_EQUAL,
T_SR_EQUAL,
T_COALESCE_EQUAL,
T_BOOLEAN_AND,
T_BOOLEAN_OR,
//T_LOGICAL_AND,
//T_LOGICAL_OR,
//T_LOGICAL_XOR,
T_SL,
T_SR,
//T_IS_IDENTICAL,
//T_IS_NOT_IDENTICAL,
//T_IS_EQUAL,
//T_IS_NOT_EQUAL,
//T_IS_SMALLER_OR_EQUAL,
//T_IS_GREATER_OR_EQUAL,
//T_SPACESHIP,
T_INSTANCEOF,
//T_INC,
//T_DEC,
//T_INT_CAST,
//T_DOUBLE_CAST,
//T_STRING_CAST,
//T_ARRAY_CAST,
//T_BOOL_CAST,
//T_UNSET_CAST,
T_POW,
T_CLONE
), true);
$finalCode .= $tokenContent;
}
$finalCode = trim($finalCode);
if(0===stripos($finalCode, '<?php')){
$finalCode = substr($finalCode, strlen('<?php'));
}
$finalCode = trim($finalCode);
$cmd = 'php -r \'' . strtr($finalCode, [
'\'' => '\'\\\'\'',
]) . '\'';
echo $cmd, "\n";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment