]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
script: add --log-in
authorKarel Zak <kzak@redhat.com>
Fri, 12 Apr 2019 12:14:55 +0000 (14:14 +0200)
committerKarel Zak <kzak@redhat.com>
Tue, 8 Oct 2019 11:11:53 +0000 (13:11 +0200)
Let's allow to log input independently on output. So it's possible to

 script --log-in infile           : logs only input
 script --log-out outfile           : logs only output
 script --log-out outfile --log-in infile : logs both to separated files

Signed-off-by: Karel Zak <kzak@redhat.com>
term-utils/script.1
term-utils/script.c

index 439e47c8e2b5ab333448475f7cf0d0c3788c2acd..5d822d498d96b073938bc21a6e53a86fde5d3424 100644 (file)
@@ -87,9 +87,17 @@ being done using `cat foo'.
 Allow the default output destination, i.e. the typescript file, to be a hard
 or symbolic link.  The command will follow a symbolic link.
 .TP
+\fB\-I\fR, \fB\-\-log\-in\fR \fIfile\fR
+Log input to the \fIfile\fR.  The log output is disabled if only \fB\-\-log\-in\fR
+specified.
+.sp
+Use this logging functionality carefully as it logs all input, including input 
+when terminal has disabled echo flag (for example it log passwords in the input).
+.TP
 \fB\-O\fR, \fB\-\-log\-out\fR \fIfile\fR
-Log output to the \fIfile\fR. The default is to log the file with name 'typescript'
-if the option is not given.
+Log output to the \fIfile\fR. The default is to log output to the file with
+name 'typescript' if the option \fB\-\-log\-out\fR or \fB\-\-log\-in\fR is not
+given.  The log output is disabled if only \fB\-\-log\-in\fR specified.
 .TP
 \fB\-T\fR, \fB\-\-log\-timing\fR \fIfile\fR
 Log timing information to the \fIfile\fR.
index a2a35944122cd78c1cd6e4f62ba35c1176225d88..9b5aa778d8f513d328f6524654da3914ce361302 100644 (file)
@@ -189,6 +189,7 @@ static void __attribute__((__noreturn__)) usage(void)
        fputs(_("Make a typescript of a terminal session.\n"), out);
 
        fputs(USAGE_OPTIONS, out);
+       fputs(_(" -I, --log-in <file>           log stdin to file\n"), out);
        fputs(_(" -O, --log-out <file>          log stdout to file (default)\n"), out);
        fputs(_(" -T, --log-timing <file>       log timing information to file\n"), out);
        fputs(_(" -a, --append                  append the output\n"), out);
@@ -887,7 +888,7 @@ int main(int argc, char **argv)
                .poll_timeout = -1
        };
        int ch;
-       const char *typescript = DEFAULT_TYPESCRIPT_FILENAME;
+       const char *outfile = NULL, *infile = NULL;
        const char *timingfile = NULL;
 
        enum { FORCE_OPTION = CHAR_MAX + 1 };
@@ -898,6 +899,7 @@ int main(int argc, char **argv)
                {"return", no_argument, NULL, 'e'},
                {"flush", no_argument, NULL, 'f'},
                {"force", no_argument, NULL, FORCE_OPTION,},
+               {"log-in", required_argument, NULL, 'I'},
                {"log-out", required_argument, NULL, 'O'},
                {"log-timing", required_argument, NULL, 'T'},
                {"output-limit", required_argument, NULL, 'o'},
@@ -927,7 +929,7 @@ int main(int argc, char **argv)
 
        script_init_debug();
 
-       while ((ch = getopt_long(argc, argv, "ac:efO:o:qT:t::Vh", longopts, NULL)) != -1) {
+       while ((ch = getopt_long(argc, argv, "ac:efI:O:o:qT:t::Vh", longopts, NULL)) != -1) {
 
                err_exclusive_options(ch, longopts, excl, excl_st);
 
@@ -947,8 +949,13 @@ int main(int argc, char **argv)
                case FORCE_OPTION:
                        ctl.force = 1;
                        break;
+               case 'I':
+                       log_associate(&ctl, &ctl.in, optarg, SCRIPT_FMT_RAW);
+                       infile = optarg;
+                       break;
                case 'O':
-                       typescript = optarg;
+                       log_associate(&ctl, &ctl.out, optarg, SCRIPT_FMT_RAW);
+                       outfile = optarg;
                        break;
                case 'o':
                        ctl.maxsz = strtosize_or_err(optarg, _("failed to parse output limit size"));
@@ -980,15 +987,18 @@ int main(int argc, char **argv)
        argc -= optind;
        argv += optind;
 
-       if (!typescript) {
+       /* default if no --log-* specified */
+       if (!outfile && !infile) {
                if (argc > 0)
-                       typescript = argv[0];
-               else
+                       outfile = argv[0];
+               else {
                        die_if_link(&ctl, DEFAULT_TYPESCRIPT_FILENAME);
-       }
+                       outfile = DEFAULT_TYPESCRIPT_FILENAME;
+               }
 
-       /* associate stdout with typescript file */
-       log_associate(&ctl, &ctl.out, typescript, SCRIPT_FMT_RAW);
+               /* associate stdout with typescript file */
+               log_associate(&ctl, &ctl.out, outfile, SCRIPT_FMT_RAW);
+       }
 
        ctl.shell = getenv("SHELL");
        if (ctl.shell == NULL)
@@ -996,11 +1006,14 @@ int main(int argc, char **argv)
 
        getmaster(&ctl);
        if (!ctl.quiet) {
-               if (!timingfile)
-                       printf(_("Script started, log file is '%s'.\n"), typescript);
-               else
-                       printf(_("Script started, log file is '%s', timing file is '%s'.\n"),
-                                       typescript, timingfile);
+               printf(_("Script started"));
+               if (outfile)
+                       printf(_(", output log file is '%s'"), outfile);
+               if (infile)
+                       printf(_(", input log file is '%s'"), infile);
+               if (timingfile)
+                       printf(_(", timing file is '%s'"), timingfile);
+               printf(_(".\n"));
        }
        enable_rawmode_tty(&ctl);