什么是能够直接发送到STDIN并从过程的STDOUT接收的好方法?我对SSH特别感兴趣,因为我想执行以下操作:
[ssh into a remote server]
[run remote commands]
[run local commands]
[run remote commands]
etc...
例如,假设我有一个本地脚本“ localScript”,它将根据“ remoteScript”的输出输出要远程运行的下一个命令。我可以做类似的事情:
output=$(ssh myServer "./remoteScript")
nextCommand=$(./localScript $output)
ssh myServer "$nextCommand"
但是这样做很好,而不必在每个步骤都关闭/重新打开SSH连接。
答案 0 :(得分:1)
您可以将SSH输入和输出重定向到FIFO-s,然后将它们用于双向通信。
例如class Demo(models.Model):
name = models.CharField(max_length=100)
class Demo1(models.Model):
demo = models.ForeignKey(Demo, default=None, blank=True, null=True, on_delete=models.CASCADE)
:
class Demo1(ModelSerializer):
demo = CharField(source='demo.name')
class Meta:
model=models.Demo1
fields = ('id', 'demo')
简单的local.sh
:
#!/bin/sh
SSH_SERVER="myServer"
# Redirect SSH input and output to temporary named pipes (FIFOs)
SSH_IN=$(mktemp -u)
SSH_OUT=$(mktemp -u)
mkfifo "$SSH_IN" "$SSH_OUT"
ssh "$SSH_SERVER" "./remote.sh" < "$SSH_IN" > "$SSH_OUT" &
# Open the FIFO-s and clean up the files
exec 3>"$SSH_IN"
exec 4<"$SSH_OUT"
rm -f "$SSH_IN" "$SSH_OUT"
# Read and write
counter=0
echo "PING${counter}" >&3
cat <&4 | while read line; do
echo "Remote responded: $line"
sleep 1
counter=$((counter+1))
echo "PING${counter}" >&3
done
答案 1 :(得分:0)
您使用的方法有效,但我认为您不能每次都重复使用相同的连接。但是,您可以执行using screen, tmux or nohup,但这将大大增加脚本的复杂性,因为现在您必须模拟按键/快捷键。我什至不确定是否可以直接使用bash进行操作。如果要模拟按键,则必须在新的x终端上运行脚本并使用xdotool to emulate the keypresses。
另一种方法是仅通过running the script on the remote server itself将整个脚本委托给SSH服务器:
ssh root@MachineB 'bash -s' < local_script.sh