Write string to a file without a shell [closed]
Clash Royale CLAN TAG#URR8PPP
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty margin-bottom:0;
up vote
4
down vote
favorite
Suppose I have an environment where there isn't a shell running, so I can't use redirection, pipes, here-documents or other shell-isms, but I can launch a command (through execvp
or some similar way). I want to write an arbitrary string to a named file. Is there a standard command that will do something like:
somecommand outputfile 'string'
for instance:
somecommand /proc/sys/net/ipv4/ip_forward '1'
A really dumb example might be:
curl -o /proc/sys/net/ipv4/ip_forward http://example.com/1.txt
where I set up 1.txt to contain the string I want.
Is there a common command that can be abused to do this?
files scripting command output
closed as unclear what you're asking by Kusalananda, schily, Thomas, Jesse_b, Jeff Schaller Jul 28 at 18:38
Please clarify your specific problem or add additional details to highlight exactly what you need. As it's currently written, itâÂÂs hard to tell exactly what you're asking. See the How to Ask page for help clarifying this question. If this question can be reworded to fit the rules in the help center, please edit the question.
 |Â
show 2 more comments
up vote
4
down vote
favorite
Suppose I have an environment where there isn't a shell running, so I can't use redirection, pipes, here-documents or other shell-isms, but I can launch a command (through execvp
or some similar way). I want to write an arbitrary string to a named file. Is there a standard command that will do something like:
somecommand outputfile 'string'
for instance:
somecommand /proc/sys/net/ipv4/ip_forward '1'
A really dumb example might be:
curl -o /proc/sys/net/ipv4/ip_forward http://example.com/1.txt
where I set up 1.txt to contain the string I want.
Is there a common command that can be abused to do this?
files scripting command output
closed as unclear what you're asking by Kusalananda, schily, Thomas, Jesse_b, Jeff Schaller Jul 28 at 18:38
Please clarify your specific problem or add additional details to highlight exactly what you need. As it's currently written, itâÂÂs hard to tell exactly what you're asking. See the How to Ask page for help clarifying this question. If this question can be reworded to fit the rules in the help center, please edit the question.
1
This would never fly, total vector for hacker to exploit.
â slmâ¦
Jul 27 at 23:13
Why is writing to a file a vector for hackers? The file is written with the standard privileges of the calling user (so the /proc/sys/... examples would need root or sudo)
â user1908704
Jul 28 at 0:06
2
If you don't have a shell, what's going to run your command? I notice you've tagged the question with "scripting". Are you referring to some other scripting language than a shell scripting language (Perl? Python?). Please clarify the question.
â Kusalananda
Jul 28 at 6:59
1
mailx
,sed
(the gnu variety cane
xecute an arbitray shell command, even),ed
,ex
,vi
,xargs
,csplit
(some few versions),luit
(commonly packaged withxterm
, so very often available),dc
(if your system can process asystem()
you can get a shell with!
)... a lot of these depend on a tty by basic standard... evenpax
ortar
can pull off what you ask with the right amount of crazy... anyway, can you not specify an output file withcurl
?
â mikeserv
Jul 28 at 7:08
1
@mikeserv You're back! I have been assuming this all means "non-interactive, spawned from execve or similar", but it could be more explicit.
â Michael Homer
Jul 28 at 7:36
 |Â
show 2 more comments
up vote
4
down vote
favorite
up vote
4
down vote
favorite
Suppose I have an environment where there isn't a shell running, so I can't use redirection, pipes, here-documents or other shell-isms, but I can launch a command (through execvp
or some similar way). I want to write an arbitrary string to a named file. Is there a standard command that will do something like:
somecommand outputfile 'string'
for instance:
somecommand /proc/sys/net/ipv4/ip_forward '1'
A really dumb example might be:
curl -o /proc/sys/net/ipv4/ip_forward http://example.com/1.txt
where I set up 1.txt to contain the string I want.
Is there a common command that can be abused to do this?
files scripting command output
Suppose I have an environment where there isn't a shell running, so I can't use redirection, pipes, here-documents or other shell-isms, but I can launch a command (through execvp
or some similar way). I want to write an arbitrary string to a named file. Is there a standard command that will do something like:
somecommand outputfile 'string'
for instance:
somecommand /proc/sys/net/ipv4/ip_forward '1'
A really dumb example might be:
curl -o /proc/sys/net/ipv4/ip_forward http://example.com/1.txt
where I set up 1.txt to contain the string I want.
Is there a common command that can be abused to do this?
files scripting command output
edited Jul 28 at 21:48
Michael Homer
42.1k6107146
42.1k6107146
asked Jul 27 at 23:01
user1908704
1273
1273
closed as unclear what you're asking by Kusalananda, schily, Thomas, Jesse_b, Jeff Schaller Jul 28 at 18:38
Please clarify your specific problem or add additional details to highlight exactly what you need. As it's currently written, itâÂÂs hard to tell exactly what you're asking. See the How to Ask page for help clarifying this question. If this question can be reworded to fit the rules in the help center, please edit the question.
closed as unclear what you're asking by Kusalananda, schily, Thomas, Jesse_b, Jeff Schaller Jul 28 at 18:38
Please clarify your specific problem or add additional details to highlight exactly what you need. As it's currently written, itâÂÂs hard to tell exactly what you're asking. See the How to Ask page for help clarifying this question. If this question can be reworded to fit the rules in the help center, please edit the question.
1
This would never fly, total vector for hacker to exploit.
â slmâ¦
Jul 27 at 23:13
Why is writing to a file a vector for hackers? The file is written with the standard privileges of the calling user (so the /proc/sys/... examples would need root or sudo)
â user1908704
Jul 28 at 0:06
2
If you don't have a shell, what's going to run your command? I notice you've tagged the question with "scripting". Are you referring to some other scripting language than a shell scripting language (Perl? Python?). Please clarify the question.
â Kusalananda
Jul 28 at 6:59
1
mailx
,sed
(the gnu variety cane
xecute an arbitray shell command, even),ed
,ex
,vi
,xargs
,csplit
(some few versions),luit
(commonly packaged withxterm
, so very often available),dc
(if your system can process asystem()
you can get a shell with!
)... a lot of these depend on a tty by basic standard... evenpax
ortar
can pull off what you ask with the right amount of crazy... anyway, can you not specify an output file withcurl
?
â mikeserv
Jul 28 at 7:08
1
@mikeserv You're back! I have been assuming this all means "non-interactive, spawned from execve or similar", but it could be more explicit.
â Michael Homer
Jul 28 at 7:36
 |Â
show 2 more comments
1
This would never fly, total vector for hacker to exploit.
â slmâ¦
Jul 27 at 23:13
Why is writing to a file a vector for hackers? The file is written with the standard privileges of the calling user (so the /proc/sys/... examples would need root or sudo)
â user1908704
Jul 28 at 0:06
2
If you don't have a shell, what's going to run your command? I notice you've tagged the question with "scripting". Are you referring to some other scripting language than a shell scripting language (Perl? Python?). Please clarify the question.
â Kusalananda
Jul 28 at 6:59
1
mailx
,sed
(the gnu variety cane
xecute an arbitray shell command, even),ed
,ex
,vi
,xargs
,csplit
(some few versions),luit
(commonly packaged withxterm
, so very often available),dc
(if your system can process asystem()
you can get a shell with!
)... a lot of these depend on a tty by basic standard... evenpax
ortar
can pull off what you ask with the right amount of crazy... anyway, can you not specify an output file withcurl
?
â mikeserv
Jul 28 at 7:08
1
@mikeserv You're back! I have been assuming this all means "non-interactive, spawned from execve or similar", but it could be more explicit.
â Michael Homer
Jul 28 at 7:36
1
1
This would never fly, total vector for hacker to exploit.
â slmâ¦
Jul 27 at 23:13
This would never fly, total vector for hacker to exploit.
â slmâ¦
Jul 27 at 23:13
Why is writing to a file a vector for hackers? The file is written with the standard privileges of the calling user (so the /proc/sys/... examples would need root or sudo)
â user1908704
Jul 28 at 0:06
Why is writing to a file a vector for hackers? The file is written with the standard privileges of the calling user (so the /proc/sys/... examples would need root or sudo)
â user1908704
Jul 28 at 0:06
2
2
If you don't have a shell, what's going to run your command? I notice you've tagged the question with "scripting". Are you referring to some other scripting language than a shell scripting language (Perl? Python?). Please clarify the question.
â Kusalananda
Jul 28 at 6:59
If you don't have a shell, what's going to run your command? I notice you've tagged the question with "scripting". Are you referring to some other scripting language than a shell scripting language (Perl? Python?). Please clarify the question.
â Kusalananda
Jul 28 at 6:59
1
1
mailx
, sed
(the gnu variety can e
xecute an arbitray shell command, even), ed
, ex
, vi
, xargs
, csplit
(some few versions), luit
(commonly packaged with xterm
, so very often available), dc
(if your system can process a system()
you can get a shell with !
)... a lot of these depend on a tty by basic standard... even pax
or tar
can pull off what you ask with the right amount of crazy... anyway, can you not specify an output file with curl
?â mikeserv
Jul 28 at 7:08
mailx
, sed
(the gnu variety can e
xecute an arbitray shell command, even), ed
, ex
, vi
, xargs
, csplit
(some few versions), luit
(commonly packaged with xterm
, so very often available), dc
(if your system can process a system()
you can get a shell with !
)... a lot of these depend on a tty by basic standard... even pax
or tar
can pull off what you ask with the right amount of crazy... anyway, can you not specify an output file with curl
?â mikeserv
Jul 28 at 7:08
1
1
@mikeserv You're back! I have been assuming this all means "non-interactive, spawned from execve or similar", but it could be more explicit.
â Michael Homer
Jul 28 at 7:36
@mikeserv You're back! I have been assuming this all means "non-interactive, spawned from execve or similar", but it could be more explicit.
â Michael Homer
Jul 28 at 7:36
 |Â
show 2 more comments
2 Answers
2
active
oldest
votes
up vote
7
down vote
If you know of any other non-empty file on the system, then with POSIX sed
:
sed -e 's/.*/hello world/' -e 'wtarget' -e q otherfile
With GNU sed
and just your own non-empty file, you can use:
sed -i.bak -e '$ihello world' -e 'd' foo
With BSD sed
, this would work instead:
sed -i.bak -e '$i
hello world' -e d foo
If you're not using a shell then presumably the linebreak isn't an issue.
With ex
, if the target file exists:
ex -c '0,$d' -c 's/^/hello world/' -c 'x' foo
This just deletes everything in the file, replaces the first line with "hello world", then writes and quits. You could do the same thing with vi
in place of ex
. Implementations are not required to support multiple -c
options, but they generally do. For many ex
implementations the requirement that the file already exist is not enforced.
Also with awk
:
awk -v FN=foo -v STR="hello world" 'BEGINprintf(STR) > FN '
will write "hello world" to file "foo".
If there are existing files containing the bytes you want at known locations, you can assemble a file byte by byte over multiple commands with dd
(in this case, alphabet
contains the alphabet, but it could be a mix of input files):
dd if=alphabet bs=1 skip=7 count=1 of=test
dd if=alphabet bs=1 skip=4 count=1 seek=1 of=test
dd if=alphabet bs=1 skip=11 count=1 seek=2 of=test
dd if=alphabet bs=1 skip=11 count=1 seek=3 of=test
dd if=alphabet bs=1 skip=14 count=1 seek=4 of=test
cat test
hello
From there, just regular cp
will work, or you might have been able to put it in-place to start with.
Less commonly, the mispipe
command from moreutils allows constructing a shell-free pipe:
mispipe "echo 1" "tee wtarget"
is equivalent to echo 1 | tee wtarget
, but returning the exit code of echo
. This uses the system()
function internally, which doesn't strictly require a shell to exist.
Finally, perl
is a common command and will let you write arbitrary programs to do whatever you want on the command line, as will python
or any other common scripting language. Similarly, if a shell just isn't "running", but it does exist, sh -c 'echo 1 > target'
will work just fine.
add a comment |Â
up vote
5
down vote
You could use awk
:
awk 'BEGIN print "Hello" > "/tmp/file"'
When an awk
program consists of only a BEGIN
statement, it just interprets that statement and doesn't process any input.
You can even parameterise this
awk -v text="World" -v file="/tmp/main" 'BEGIN print text > file'
Though with that syntax, you'd need to escape backslash characters. Using ARGV
doesn't have the problem:
awk 'BEGIN print ARGV[1] > ARGV[2]' World /tmp/main
They both work, but the second requires GNU awk - it doesn't work with BSD awk
â user1908704
Jul 28 at 0:11
@user1908704, that syntax is standard and comes from nawk. However, in the early versions, you needed-v
and the assignment to be separate arguments (-v var=value
, not-vvar=value
), I've added the extra space.
â Stéphane Chazelas
Jul 28 at 6:51
@Kusalananda, can you please clarify? Though those are shell command lines, you don't need a shell to execute thatawk
command, you just need to callawk
, with["awk", "BEGIN print ARGV[1] > ARGV[2]", "World", "/tmp/main"]
as arguments (using whatever syntax the non-shell context supports)
â Stéphane Chazelas
Jul 28 at 7:04
add a comment |Â
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
7
down vote
If you know of any other non-empty file on the system, then with POSIX sed
:
sed -e 's/.*/hello world/' -e 'wtarget' -e q otherfile
With GNU sed
and just your own non-empty file, you can use:
sed -i.bak -e '$ihello world' -e 'd' foo
With BSD sed
, this would work instead:
sed -i.bak -e '$i
hello world' -e d foo
If you're not using a shell then presumably the linebreak isn't an issue.
With ex
, if the target file exists:
ex -c '0,$d' -c 's/^/hello world/' -c 'x' foo
This just deletes everything in the file, replaces the first line with "hello world", then writes and quits. You could do the same thing with vi
in place of ex
. Implementations are not required to support multiple -c
options, but they generally do. For many ex
implementations the requirement that the file already exist is not enforced.
Also with awk
:
awk -v FN=foo -v STR="hello world" 'BEGINprintf(STR) > FN '
will write "hello world" to file "foo".
If there are existing files containing the bytes you want at known locations, you can assemble a file byte by byte over multiple commands with dd
(in this case, alphabet
contains the alphabet, but it could be a mix of input files):
dd if=alphabet bs=1 skip=7 count=1 of=test
dd if=alphabet bs=1 skip=4 count=1 seek=1 of=test
dd if=alphabet bs=1 skip=11 count=1 seek=2 of=test
dd if=alphabet bs=1 skip=11 count=1 seek=3 of=test
dd if=alphabet bs=1 skip=14 count=1 seek=4 of=test
cat test
hello
From there, just regular cp
will work, or you might have been able to put it in-place to start with.
Less commonly, the mispipe
command from moreutils allows constructing a shell-free pipe:
mispipe "echo 1" "tee wtarget"
is equivalent to echo 1 | tee wtarget
, but returning the exit code of echo
. This uses the system()
function internally, which doesn't strictly require a shell to exist.
Finally, perl
is a common command and will let you write arbitrary programs to do whatever you want on the command line, as will python
or any other common scripting language. Similarly, if a shell just isn't "running", but it does exist, sh -c 'echo 1 > target'
will work just fine.
add a comment |Â
up vote
7
down vote
If you know of any other non-empty file on the system, then with POSIX sed
:
sed -e 's/.*/hello world/' -e 'wtarget' -e q otherfile
With GNU sed
and just your own non-empty file, you can use:
sed -i.bak -e '$ihello world' -e 'd' foo
With BSD sed
, this would work instead:
sed -i.bak -e '$i
hello world' -e d foo
If you're not using a shell then presumably the linebreak isn't an issue.
With ex
, if the target file exists:
ex -c '0,$d' -c 's/^/hello world/' -c 'x' foo
This just deletes everything in the file, replaces the first line with "hello world", then writes and quits. You could do the same thing with vi
in place of ex
. Implementations are not required to support multiple -c
options, but they generally do. For many ex
implementations the requirement that the file already exist is not enforced.
Also with awk
:
awk -v FN=foo -v STR="hello world" 'BEGINprintf(STR) > FN '
will write "hello world" to file "foo".
If there are existing files containing the bytes you want at known locations, you can assemble a file byte by byte over multiple commands with dd
(in this case, alphabet
contains the alphabet, but it could be a mix of input files):
dd if=alphabet bs=1 skip=7 count=1 of=test
dd if=alphabet bs=1 skip=4 count=1 seek=1 of=test
dd if=alphabet bs=1 skip=11 count=1 seek=2 of=test
dd if=alphabet bs=1 skip=11 count=1 seek=3 of=test
dd if=alphabet bs=1 skip=14 count=1 seek=4 of=test
cat test
hello
From there, just regular cp
will work, or you might have been able to put it in-place to start with.
Less commonly, the mispipe
command from moreutils allows constructing a shell-free pipe:
mispipe "echo 1" "tee wtarget"
is equivalent to echo 1 | tee wtarget
, but returning the exit code of echo
. This uses the system()
function internally, which doesn't strictly require a shell to exist.
Finally, perl
is a common command and will let you write arbitrary programs to do whatever you want on the command line, as will python
or any other common scripting language. Similarly, if a shell just isn't "running", but it does exist, sh -c 'echo 1 > target'
will work just fine.
add a comment |Â
up vote
7
down vote
up vote
7
down vote
If you know of any other non-empty file on the system, then with POSIX sed
:
sed -e 's/.*/hello world/' -e 'wtarget' -e q otherfile
With GNU sed
and just your own non-empty file, you can use:
sed -i.bak -e '$ihello world' -e 'd' foo
With BSD sed
, this would work instead:
sed -i.bak -e '$i
hello world' -e d foo
If you're not using a shell then presumably the linebreak isn't an issue.
With ex
, if the target file exists:
ex -c '0,$d' -c 's/^/hello world/' -c 'x' foo
This just deletes everything in the file, replaces the first line with "hello world", then writes and quits. You could do the same thing with vi
in place of ex
. Implementations are not required to support multiple -c
options, but they generally do. For many ex
implementations the requirement that the file already exist is not enforced.
Also with awk
:
awk -v FN=foo -v STR="hello world" 'BEGINprintf(STR) > FN '
will write "hello world" to file "foo".
If there are existing files containing the bytes you want at known locations, you can assemble a file byte by byte over multiple commands with dd
(in this case, alphabet
contains the alphabet, but it could be a mix of input files):
dd if=alphabet bs=1 skip=7 count=1 of=test
dd if=alphabet bs=1 skip=4 count=1 seek=1 of=test
dd if=alphabet bs=1 skip=11 count=1 seek=2 of=test
dd if=alphabet bs=1 skip=11 count=1 seek=3 of=test
dd if=alphabet bs=1 skip=14 count=1 seek=4 of=test
cat test
hello
From there, just regular cp
will work, or you might have been able to put it in-place to start with.
Less commonly, the mispipe
command from moreutils allows constructing a shell-free pipe:
mispipe "echo 1" "tee wtarget"
is equivalent to echo 1 | tee wtarget
, but returning the exit code of echo
. This uses the system()
function internally, which doesn't strictly require a shell to exist.
Finally, perl
is a common command and will let you write arbitrary programs to do whatever you want on the command line, as will python
or any other common scripting language. Similarly, if a shell just isn't "running", but it does exist, sh -c 'echo 1 > target'
will work just fine.
If you know of any other non-empty file on the system, then with POSIX sed
:
sed -e 's/.*/hello world/' -e 'wtarget' -e q otherfile
With GNU sed
and just your own non-empty file, you can use:
sed -i.bak -e '$ihello world' -e 'd' foo
With BSD sed
, this would work instead:
sed -i.bak -e '$i
hello world' -e d foo
If you're not using a shell then presumably the linebreak isn't an issue.
With ex
, if the target file exists:
ex -c '0,$d' -c 's/^/hello world/' -c 'x' foo
This just deletes everything in the file, replaces the first line with "hello world", then writes and quits. You could do the same thing with vi
in place of ex
. Implementations are not required to support multiple -c
options, but they generally do. For many ex
implementations the requirement that the file already exist is not enforced.
Also with awk
:
awk -v FN=foo -v STR="hello world" 'BEGINprintf(STR) > FN '
will write "hello world" to file "foo".
If there are existing files containing the bytes you want at known locations, you can assemble a file byte by byte over multiple commands with dd
(in this case, alphabet
contains the alphabet, but it could be a mix of input files):
dd if=alphabet bs=1 skip=7 count=1 of=test
dd if=alphabet bs=1 skip=4 count=1 seek=1 of=test
dd if=alphabet bs=1 skip=11 count=1 seek=2 of=test
dd if=alphabet bs=1 skip=11 count=1 seek=3 of=test
dd if=alphabet bs=1 skip=14 count=1 seek=4 of=test
cat test
hello
From there, just regular cp
will work, or you might have been able to put it in-place to start with.
Less commonly, the mispipe
command from moreutils allows constructing a shell-free pipe:
mispipe "echo 1" "tee wtarget"
is equivalent to echo 1 | tee wtarget
, but returning the exit code of echo
. This uses the system()
function internally, which doesn't strictly require a shell to exist.
Finally, perl
is a common command and will let you write arbitrary programs to do whatever you want on the command line, as will python
or any other common scripting language. Similarly, if a shell just isn't "running", but it does exist, sh -c 'echo 1 > target'
will work just fine.
edited Jul 28 at 0:43
answered Jul 28 at 0:10
Michael Homer
42.1k6107146
42.1k6107146
add a comment |Â
add a comment |Â
up vote
5
down vote
You could use awk
:
awk 'BEGIN print "Hello" > "/tmp/file"'
When an awk
program consists of only a BEGIN
statement, it just interprets that statement and doesn't process any input.
You can even parameterise this
awk -v text="World" -v file="/tmp/main" 'BEGIN print text > file'
Though with that syntax, you'd need to escape backslash characters. Using ARGV
doesn't have the problem:
awk 'BEGIN print ARGV[1] > ARGV[2]' World /tmp/main
They both work, but the second requires GNU awk - it doesn't work with BSD awk
â user1908704
Jul 28 at 0:11
@user1908704, that syntax is standard and comes from nawk. However, in the early versions, you needed-v
and the assignment to be separate arguments (-v var=value
, not-vvar=value
), I've added the extra space.
â Stéphane Chazelas
Jul 28 at 6:51
@Kusalananda, can you please clarify? Though those are shell command lines, you don't need a shell to execute thatawk
command, you just need to callawk
, with["awk", "BEGIN print ARGV[1] > ARGV[2]", "World", "/tmp/main"]
as arguments (using whatever syntax the non-shell context supports)
â Stéphane Chazelas
Jul 28 at 7:04
add a comment |Â
up vote
5
down vote
You could use awk
:
awk 'BEGIN print "Hello" > "/tmp/file"'
When an awk
program consists of only a BEGIN
statement, it just interprets that statement and doesn't process any input.
You can even parameterise this
awk -v text="World" -v file="/tmp/main" 'BEGIN print text > file'
Though with that syntax, you'd need to escape backslash characters. Using ARGV
doesn't have the problem:
awk 'BEGIN print ARGV[1] > ARGV[2]' World /tmp/main
They both work, but the second requires GNU awk - it doesn't work with BSD awk
â user1908704
Jul 28 at 0:11
@user1908704, that syntax is standard and comes from nawk. However, in the early versions, you needed-v
and the assignment to be separate arguments (-v var=value
, not-vvar=value
), I've added the extra space.
â Stéphane Chazelas
Jul 28 at 6:51
@Kusalananda, can you please clarify? Though those are shell command lines, you don't need a shell to execute thatawk
command, you just need to callawk
, with["awk", "BEGIN print ARGV[1] > ARGV[2]", "World", "/tmp/main"]
as arguments (using whatever syntax the non-shell context supports)
â Stéphane Chazelas
Jul 28 at 7:04
add a comment |Â
up vote
5
down vote
up vote
5
down vote
You could use awk
:
awk 'BEGIN print "Hello" > "/tmp/file"'
When an awk
program consists of only a BEGIN
statement, it just interprets that statement and doesn't process any input.
You can even parameterise this
awk -v text="World" -v file="/tmp/main" 'BEGIN print text > file'
Though with that syntax, you'd need to escape backslash characters. Using ARGV
doesn't have the problem:
awk 'BEGIN print ARGV[1] > ARGV[2]' World /tmp/main
You could use awk
:
awk 'BEGIN print "Hello" > "/tmp/file"'
When an awk
program consists of only a BEGIN
statement, it just interprets that statement and doesn't process any input.
You can even parameterise this
awk -v text="World" -v file="/tmp/main" 'BEGIN print text > file'
Though with that syntax, you'd need to escape backslash characters. Using ARGV
doesn't have the problem:
awk 'BEGIN print ARGV[1] > ARGV[2]' World /tmp/main
edited Jul 28 at 6:48
Stéphane Chazelas
278k52511841
278k52511841
answered Jul 27 at 23:28
roaima
39.2k544105
39.2k544105
They both work, but the second requires GNU awk - it doesn't work with BSD awk
â user1908704
Jul 28 at 0:11
@user1908704, that syntax is standard and comes from nawk. However, in the early versions, you needed-v
and the assignment to be separate arguments (-v var=value
, not-vvar=value
), I've added the extra space.
â Stéphane Chazelas
Jul 28 at 6:51
@Kusalananda, can you please clarify? Though those are shell command lines, you don't need a shell to execute thatawk
command, you just need to callawk
, with["awk", "BEGIN print ARGV[1] > ARGV[2]", "World", "/tmp/main"]
as arguments (using whatever syntax the non-shell context supports)
â Stéphane Chazelas
Jul 28 at 7:04
add a comment |Â
They both work, but the second requires GNU awk - it doesn't work with BSD awk
â user1908704
Jul 28 at 0:11
@user1908704, that syntax is standard and comes from nawk. However, in the early versions, you needed-v
and the assignment to be separate arguments (-v var=value
, not-vvar=value
), I've added the extra space.
â Stéphane Chazelas
Jul 28 at 6:51
@Kusalananda, can you please clarify? Though those are shell command lines, you don't need a shell to execute thatawk
command, you just need to callawk
, with["awk", "BEGIN print ARGV[1] > ARGV[2]", "World", "/tmp/main"]
as arguments (using whatever syntax the non-shell context supports)
â Stéphane Chazelas
Jul 28 at 7:04
They both work, but the second requires GNU awk - it doesn't work with BSD awk
â user1908704
Jul 28 at 0:11
They both work, but the second requires GNU awk - it doesn't work with BSD awk
â user1908704
Jul 28 at 0:11
@user1908704, that syntax is standard and comes from nawk. However, in the early versions, you needed
-v
and the assignment to be separate arguments (-v var=value
, not -vvar=value
), I've added the extra space.â Stéphane Chazelas
Jul 28 at 6:51
@user1908704, that syntax is standard and comes from nawk. However, in the early versions, you needed
-v
and the assignment to be separate arguments (-v var=value
, not -vvar=value
), I've added the extra space.â Stéphane Chazelas
Jul 28 at 6:51
@Kusalananda, can you please clarify? Though those are shell command lines, you don't need a shell to execute that
awk
command, you just need to call awk
, with ["awk", "BEGIN print ARGV[1] > ARGV[2]", "World", "/tmp/main"]
as arguments (using whatever syntax the non-shell context supports)â Stéphane Chazelas
Jul 28 at 7:04
@Kusalananda, can you please clarify? Though those are shell command lines, you don't need a shell to execute that
awk
command, you just need to call awk
, with ["awk", "BEGIN print ARGV[1] > ARGV[2]", "World", "/tmp/main"]
as arguments (using whatever syntax the non-shell context supports)â Stéphane Chazelas
Jul 28 at 7:04
add a comment |Â
1
This would never fly, total vector for hacker to exploit.
â slmâ¦
Jul 27 at 23:13
Why is writing to a file a vector for hackers? The file is written with the standard privileges of the calling user (so the /proc/sys/... examples would need root or sudo)
â user1908704
Jul 28 at 0:06
2
If you don't have a shell, what's going to run your command? I notice you've tagged the question with "scripting". Are you referring to some other scripting language than a shell scripting language (Perl? Python?). Please clarify the question.
â Kusalananda
Jul 28 at 6:59
1
mailx
,sed
(the gnu variety cane
xecute an arbitray shell command, even),ed
,ex
,vi
,xargs
,csplit
(some few versions),luit
(commonly packaged withxterm
, so very often available),dc
(if your system can process asystem()
you can get a shell with!
)... a lot of these depend on a tty by basic standard... evenpax
ortar
can pull off what you ask with the right amount of crazy... anyway, can you not specify an output file withcurl
?â mikeserv
Jul 28 at 7:08
1
@mikeserv You're back! I have been assuming this all means "non-interactive, spawned from execve or similar", but it could be more explicit.
â Michael Homer
Jul 28 at 7:36