Нет; это невозможно. USB - это протокол ведущий / ведомый (узел / устройство). Вы можете подключать устройства только к хосту, а хост может быть подключен только к устройствам. Дополнение USB On The Go позволяет некоторым гаджетам (только сотовым телефонам и планшетам) действовать как одно или другое, в зависимости от того, к чему они подключены, но настольные ПК являются только хостом и поэтому не могут быть подключены друг к другу. .
Esto no está realmente relacionado con las citas, sino con el procesamiento de argumentos.
Considere el ejemplo arriesgado:
find -exec sh -c "something {}" \;
Esto es analizado por el shell y dividido en seis palabras :find
, -exec
, sh
, -c
,something {}
(ya no hay comillas ), ;
. No hay nada que ampliar. El shell ejecuta find
con esas seis palabras como argumentos.
Cuando find
encuentra algo para procesar, digamos foo; rm -rf $HOME
, reemplaza {}
con foo; rm -rf $HOME
y ejecuta sh
con los argumentos sh
, -c
y something foo; rm -rf $HOME
.
sh
ahora ve -c
y, como resultado, analizasomething foo; rm -rf $HOME
(el primer argumento de opción no -)y ejecuta el resultado.
Ahora considere la variante más segura:
find -exec sh -c 'something "$@"' sh {} \;
El shell ejecuta find
con los argumentos find
, -exec
, sh
, -c
, something "$@"
, sh
, {}
, ;
.
Ahora, cuando find
encuentra foo; rm -rf $HOME
, reemplaza {}
nuevamente y ejecuta sh
con los argumentos sh
, -c
, something "$@"
, sh
, foo; rm -rf $HOME
.
sh
ve -c
y analiza something "$@"
como el comando a ejecutar, y sh
y foo; rm -rf $HOME
como los parámetros posicionales(a partir de $0
), expande "$@"
afoo; rm -rf $HOME
como un valor único , y ejecuta something
con el argumento único foo; rm -rf $HOME
.
Puede ver esto usando printf
. Cree un nuevo directorio, ingréselo,y corre
touch "hello; echo pwned"
Ejecutando la primera variante de la siguiente manera
find -exec sh -c "printf \"Argument: %s\n\" {}" \;
produce
Argument:.
Argument:./hello
pwned
mientras que la segunda variante, se ejecuta como
find -exec sh -c 'printf "Argument: %s\n" "$@"' sh {} \;
produce
Argument:.
Argument:./hello; echo pwned
Parte 1:
find
solo usa reemplazo de texto.
Sí, si lo hiciste sin comillas, así:
find. -type f -exec sh -c "echo {}" \;
y un atacante pudo crear un archivo llamado ; echo owned
, luego ejecutaría
sh -c "echo ; echo owned"
, lo que daría como resultado que el shell ejecute echo
y luego echo owned
.
Pero si agregó comillas, el atacante podría simplemente finalizar sus comillas y luego colocar el comando malicioso después creando un archivo llamado'; echo owned
:
find. -type f -exec sh -c "echo '{}'" \;
, lo que daría como resultado que el shell se ejecute echo ''
, echo owned
.
(si cambia las comillas dobles por comillas simples, el atacante también podría usar el otro tipo de comillas.)
Parte 2:
En find -exec sh -c 'something "$@"' sh {} \;
, el shell no interpreta {}
inicialmente, se ejecuta directamente con execve
, por lo que agregar comillas de shell no ayudaría.
find -exec sh -c 'something "$@"' sh "{}" \;
no tiene ningún efecto, ya que el shell elimina las comillas dobles antes de ejecutar find
.
find -exec sh -c 'something "$@"' sh "'{}'" \;
agrega comillas que el shell no trata de manera especial, por lo que en la mayoría de los casos solo significa que el comando no hará lo que usted quiere.
Hacer que se expanda a /tmp/foo;
, rm
, -rf
, $HOME
no debería ser un problema, porque esos son argumentos para something
, y something
probablemente no trata sus argumentos como comandos a ejecutar.
Parte 3:
Supongo que se aplican consideraciones similares para cualquier cosa que tome una entrada que no sea de confianza y la ejecute como (parte de )un comando, por ejemplo xargs
y parallel
.
Su preocupación es precisamente la razón por la cual GNU Parallel cita la entrada:
touch "hello; echo pwned"
find. -print0 | parallel -0 printf \"Argument: %s\\n\" {}
Esto no se ejecutará echo pwned
.
Ejecutará un shell, de modo que si extiende su comando, no recibirá una sorpresa repentina:
# This _could_ be run without spawining a shell
parallel "grep -E 'a|bc' {}" ::: foo
# This cannot
parallel "grep -E 'a|bc' {} | wc" ::: foo
Para obtener más detalles sobre el problema del desove -a -shell, consulte:https://www.gnu.org/software/parallel/parallel_design.html#Always-running-commands-in-a-shell