#1 Le 27/10/2011, à 23:11
- ®om
Faire croire à un programme qu'il écrit dans un terminal ou non
Difficile de trouver un titre explicite, mais la question n'est pas très compliquée.
Je crée un fichier :
$ echo content > file
Je peux le compresser en tar.gz en utilisant la redirection '>' (c'est pour l'exemple), puis l'afficher dans la console :
$ tar cz file > file.tar.gz
$ cat file.tar.gz
ǩN1
@Э=alyD"4"^3|s.}XZtmzͧB]oJJ{釘qmOczy(
(ça affiche n'importe quoi, normal)
Maintenant, si je veux faire la même chose, mais sans passer par un fichier intermédiaire, tar le détecte et refuse d'écrire dans le terminal :
$ tar cz file
gzip: compressed data not written to a terminal. Use -f to force compression.
For help, type: gzip -h
tar: Child returned status 1
tar: Error is not recoverable: exiting now
Comment le détecte-t-il (comment fait-on, dans un programme C, python, bash ou autre, que stdout correspond à un shell) ?
Est-il possible de lui "mentir" (lui faire croire que ce n'est pas un shell alors que c'en est un, ou l'inverse) ?
Merci de votre aide.
Hors ligne
#2 Le 27/10/2011, à 23:34
- kisscoolkiller
Re : Faire croire à un programme qu'il écrit dans un terminal ou non
tar cz file
Cette commande créé un fichier archive compressé nommé "file" de ... Ben de rien du tout puisque tu le lui dit pas ce qu'il doit archiver. C'est ta commande qui est fausse.
Il faut mettre :
tar cz file.tgz fichiers-a-archiver
Hors ligne
#3 Le 27/10/2011, à 23:39
- ®om
Re : Faire croire à un programme qu'il écrit dans un terminal ou non
tar cz file
Cette commande créé un fichier archive compressé nommé "file" de ... Ben de rien du tout puisque tu le lui dit pas ce qu'il doit archiver. C'est ta commande qui est fausse.
Il faut mettre :tar cz file.tgz fichiers-a-archiver
Non, ce serait :
tar czf file.tgz fichiers-a-archiver
Si tu ne précise pas le f, ça écrit sur la sortie standard. Ça marche d'ailleurs très bien avec la redirection ;-)
Le "problème" (enfin ce n'est pas un problème, plutôt une curiosité) est vraiment la détection de si on est dans un terminal ou non.
Hors ligne
#4 Le 27/10/2011, à 23:54
- sputnick
Re : Faire croire à un programme qu'il écrit dans un terminal ou non
Dans un premier terminal
mkfifo /tmp/fifo
cat !$
Dans un deuxième terminal
tar cjf /tmp/fifo /path/to/directory/*
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#5 Le 27/10/2011, à 23:57
- kisscoolkiller
Re : Faire croire à un programme qu'il écrit dans un terminal ou non
Ah oui, désolé, j'ai écrit n'importe quoi. C'est à cause de la 1664 que je viens de m'enfiler...
Je pense que tar se base sur une commande genre tty.
Ceci dit, il te permet de quand même faire ce que tu veux en forçant avec l'option -f (voir son message), mais ta façon de procéder ne me parait pas prudente. En effet, il n'est déjà pas toujours facile d'afficher correctement une simple chaîne de caractère dans un terminal (les accents en utf-8 ou iso), alors une sortie compressée, on n'en parle même pas. Et ça risquerait également de planter ton terminal, comme quand on fait un cat d'un binaire. Donc tar te mets en garde contre le fait que tu es un fou dangereux !!!
Sinon, si ta question est de savoir si oui ou non tu es dans un terminal, jette un coup d'oeil à tty. J'ai vu quelques scripts qui commencent par "if tty ...". Google t'en dira plus, par exemple : http://www.unix.com/shell-programming-s … y-not.html.
Hors ligne
#6 Le 28/10/2011, à 11:37
- ®om
Re : Faire croire à un programme qu'il écrit dans un terminal ou non
Dans un premier terminal
mkfifo /tmp/fifo cat !$
Dans un deuxième terminal
tar cjf /tmp/fifo /path/to/directory/*
Oui, mais ça n'est plus la même commande qui est appelée (au lieu d'écrire sur stdout, on dit à tar, avec l'option 'f', d'écrire dans /tmp/fifo).
Je cherchais une méthode qui fonctionnait quelque soit le programme (ici on compte sur le fait que tar ait une option qui permette d'écrire dans un fichier).
Hors ligne
#7 Le 28/10/2011, à 14:00
- ehmicky
Re : Faire croire à un programme qu'il écrit dans un terminal ou non
Salut,
tar cz FILE | cat
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#8 Le 28/10/2011, à 14:06
- ®om
Re : Faire croire à un programme qu'il écrit dans un terminal ou non
Salut,
tar cz FILE | cat
Oui, effectivement, ça fonctionne dans ce sens, car au lieu d'écrire dans le terminal, le pipe indique à tar que la sortie n'est pas un terminal (et c'est cat qui écrit dans le terminal).
Maintenant, supposons qu'on veuille faire l'inverse : écrire dans un fichier ce que tar écrit lorsqu'il croit que c'est un terminal.
Ici, si je veux écrire :
gzip: compressed data not written to a terminal. Use -f to force compression.
dans un fichier en utilisant "tar cz file". Est-ce possible ?
Hors ligne
#9 Le 28/10/2011, à 14:44
- ehmicky
Re : Faire croire à un programme qu'il écrit dans un terminal ou non
tar cz FILE 2> FILE_DEUX
Mais je vois pas vraiment l'intérêt
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#10 Le 28/10/2011, à 15:22
- ®om
Re : Faire croire à un programme qu'il écrit dans un terminal ou non
tar cz FILE 2> FILE_DEUX
Mais je vois pas vraiment l'intérêt
ça ne fait pas EXACTEMENT la même chose (là on écrit juste stderr).
Je voudrais que le programme se comporte exactement comme s'il était lancé en shell (ou pas en shell, c'est selon).
Dans un sens, la réponse ci-dessus correspond par faitement : pour obtenir ce qu'un programme écrit dans un pipe alors qu'on est dans un terminal, il suffit de le brancher dans un pipe à cat :
monprogramme | cat
Mais dans l'autre sens, je n'ai pas de solution (autre que lancer un screen et sauver le contenu du screen).
Par exemple, là où ça peut avoir un intérêt, c'est pour :
xinput test 11
qui écrit les touches pressées dans un terminal, mais n'écrit rien dans un pipe.
Hors ligne
#11 Le 28/10/2011, à 20:45
- kisscoolkiller
Re : Faire croire à un programme qu'il écrit dans un terminal ou non
Je n'arrive vraiment pas à comprendre ce que tu veux faire au final...
Hors ligne
#12 Le 28/10/2011, à 21:12
- sputnick
Re : Faire croire à un programme qu'il écrit dans un terminal ou non
@kisscoolkiller +1
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#13 Le 28/10/2011, à 21:31
- ®om
Re : Faire croire à un programme qu'il écrit dans un terminal ou non
Je n'arrive vraiment pas à comprendre ce que tu veux faire au final...
Je veux faire joujou avec xinput.
xinput test <id>
écrit dans un terminal toutes les touches pressées au clavier.
Par contre :
xinput test <id> | cat
ou
xinput test <id> > file
n'écrit rien du tout.
Je voudrais donc lui faire croire que je suis dans un terminal (autrement qu'en le lançant dans un "screen").
Hors ligne
#14 Le 29/10/2011, à 00:36
- ehmicky
Re : Faire croire à un programme qu'il écrit dans un terminal ou non
ehmicky a écrit :tar cz FILE 2> FILE_DEUX
Mais je vois pas vraiment l'intérêt
ça ne fait pas EXACTEMENT la même chose (là on écrit juste stderr).
Dans ce cas-là, tu peux remplacer 2> par &>.
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#15 Le 29/10/2011, à 00:50
- ®om
Re : Faire croire à un programme qu'il écrit dans un terminal ou non
®om a écrit :ehmicky a écrit :tar cz FILE 2> FILE_DEUX
Mais je vois pas vraiment l'intérêt
ça ne fait pas EXACTEMENT la même chose (là on écrit juste stderr).
Dans ce cas-là, tu peux remplacer 2> par &>.
Justement, c'est le problème : si tu utilises une redirection, ça n'écrit pas la même chose dans le fichier que ce qui s'affiche dans la console.
Avec ta commande, ça écrit le fichier compressé, alors que dans la console ça écrivait un message.
Compare
tar cz file
et
tar cz file &> file.tar.gz; cat tar.gz
Dernière modification par ®om (Le 29/10/2011, à 00:52)
Hors ligne