Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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

kisscoolkiller a écrit :
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... big_smile

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 !!! tongue

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

sputnick a écrit :

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

ehmicky a écrit :

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 big_smile wink


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

ehmicky a écrit :
tar cz FILE 2> FILE_DEUX

Mais je vois pas vraiment l'intérêt big_smile wink

ç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

kisscoolkiller a écrit :

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

®om a écrit :
ehmicky a écrit :
tar cz FILE 2> FILE_DEUX

Mais je vois pas vraiment l'intérêt big_smile wink

ç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

ehmicky a écrit :
®om a écrit :
ehmicky a écrit :
tar cz FILE 2> FILE_DEUX

Mais je vois pas vraiment l'intérêt big_smile wink

ç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