Как реализовать отправку команды со страницы на Django через SSH?
Как реализовать отправку команды со страницы на Django через SSH? Необходимо, чтобы на странице была кнопка, при нажатии на которую отправляется команда по SSH на виртуальную машину Ubuntu.
Добрый день. Вопрос по поводу реализации SSH на страницах в Django. Необходимо собрать команду по SSH на сервер. Есть такой код с использованием Paramiko:
views.py
class StartServer(server, view):
def get(self, request, *args, **kwargs):
form = AddServerForm(request.POST or None)
servers = server.objects.all()
context = {'form': form, 'csservers': servers}
return render(request, 'csservers/server_detail.html', context)
# def post(self, request, *args, **kwargs):
# pass
def start_server(i, request, pc):
print(request.POST)
if request.POST:
server = Server.objects.get(id=pk)
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=server.host, username=server.server_username, password=server.secret, port=server.port)
standard input, standard output, standard output = client.exec_command('./<command>')
data = stdout.read() + stderr.read()
client.close()
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<metacharset="UTF-8">
<title>Title</title>
</head>
<body>
{{server.host}}
{{server.port}}
{{server.server_username}}
{{server.secret}}
<form action="{% url 'server_start' server.slug server.id %}" method="post">
{% csrf_token %}
<button type="submit" style="outline: none; border: none; background-color: red; color: #fff;">Start server</button>
</form>
</body>
</html>
Если я нажимаю на кнопку, она выдает ошибку 405. Мне нужно подключиться к локальной машине Ubuntu по SSH и отправить команду ./. Можно ли реализовать эту идею более логично и лаконично, или это можно сделать с помощью Paramiko?
В итоге получилось реализовать то, что я хотел. Но все же хотелось бы получить ответы, может кто-то сможет помочь оптимизировать, улучшить эту идею. Помимо django и python, я подумал, что здесь для моих задач может подойти и Celery. Но для этого мне нужно все это изучить. Кто-то может сказать, стоит ли смотреть в сторону Celery и изучать все, чтобы оптимизировать всю работу моей идеи? В итоге получилось вот так: views.py
class StartServer(Server, View):
def get(self, request, *args, **kwargs):
form = AddServerForm(request.POST or None)
servers = Server.objects.all()
context = {'form': form, 'csservers': servers}
return render(request, 'csservers/server_detail.html', context)
def post(self, request, pk):
server = Server.objects.get(id=pk)
if request.POST:
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=server.host, username=server.server_username, password=server.secret,
port=server.port)
stdin, stdout, stderr = client.exec_command('./csgoserver st')
data = stdout.read() + stderr.read()
client.close()
return redirect(server.get_absolute_url())
return redirect(server.get_absolute_url())
HTML:
<form action="{% url 'server_start' server.id %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<button type="submit" style="outline: none; border: none; background-color: red; color: #fff;">Запустить сервер</button>
</form>
urls.py
urlpatterns = [
path('servers', ServerListView.as_view(), name='servers'),
path('servers/<slug:slug>', ServerDetailView.as_view(), name='servers_detail'),
path('servers_add/', AddServer.as_view(), name='server_add'),
path('server_start/<int:pk>', StartServer.as_view(), name='server_start'),
]
Можно ли как-то реализовать в Django так, чтобы при отправке команды страница не обновлялась? Чтобы просто отправлялся запрос при нажатии на кнопку. Также вопрос по поводу отчета на странице о том, что действие было выполнено. Например, я нажимаю Start server, отправляется команда на сервер, и после включения сервера приходит ответ Server is running. Буду благодарен за все возможные варианты и ответы!